Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline finex  
#1 Оставлено : 20 сентября 2019 г. 15:42:08(UTC)
finex

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Доброго времени суток.
Пишу выгрузку на портал госзакупок с использованием WinHttpRequest и TLS. Авторизация идет по сертификату
Столкнулся со следующей проблемой:
У пользователя в личном хранилище много сертификатов, все рабочие и на каждый своя флешка. При этом с порталом госзакупок он может работать с помощью 3 сертификатов. У всех этих 3 сертификатов одинаковое имя (Кому выдан). В результате при попытке задать сертификат по имени COM-объект WinHTTP натыкается на несколько сертификатов и не берет ни один из них. А если сертификат не указывать, то сразу идет запрос к оборудованию на предмет "воткнуть флеху". Только вот просит он воткнуть флеху с первым попавшимся сертификатом (берет первый сертификат из хранилища пользователя, но это совсем не тот что нам нужен).
Учитывая то что метод SetClientCertificate для поиска сертификата работает только с именем и оно в моем случае не уникально, а диалога выбора в таком случае не появляется, надо как то сделать определенный сертификат сертификатом по умолчанию.
Дословно: в диалоге выбора сертификатов я вижу список из сертификатов вида:
1 Иванов
2 Петров
3 Сидоров
4 Петров
5 Макаров
6 Петров
7 Пупкин
Как сделать так чтобы первым сертификатом для работы был сертификат Петров, который в текущем списке стоит на 6 позиции.
Ну или как подсунуть его в WinHttp т.к. по имени Петров код
WinHttp.SetClientCertificate("Петров") не работает.
Если подкидывать другие сертификаты, то появляется окно с запросом воткнуть определенную флеху (для каждого свою)

Кусок кода которым делаю вызов (синтаксис не c#)
Код:
 WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")     
 
  // добавить клиентский сертификат
  if Assigned(CertificateName)
    WinHttp.SetClientCertificate(CertificateName) // если не вызывать этот метод то работает с первым найденным     
  endif           
   // открыть соединение
  WinHttp.Open("POST"; WebServiceURL; false; UserName; Password)
  // basic-авторизация на сервере  
  if Assigned(UserName)
    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
    HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1
   WinHttp.SetCredentials(UserName; Password; HTTPREQUEST_SETCREDENTIALS_FOR_SERVER)
  endif  
  FileName = 'document.xml'
  boundary ='asdqwerty'
  // задать HTTP заголовки
  WinHttp.setRequestHeader("content-type"; 'multipart/form-data; boundary='& boundary)
  WinHttp.setRequestHeader("host"; Host)
  WinHttp.setRequestHeader("content-length"; Length(Message))
  WinHttp.setRequestHeader("connection"; "Keep-Alive")
  WinHttp.setRequestHeader("cache-control"; "no-cache")
   WinHttp.Send(Message)
Offline Дмитрий Пичулин  
#2 Оставлено : 20 сентября 2019 г. 16:21:50(UTC)
pd

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC)
Сообщений: 1,440
Откуда: КРИПТО-ПРО

Сказал(а) «Спасибо»: 31 раз
Поблагодарили: 410 раз в 305 постах
Автор: finex Перейти к цитате
Доброго времени суток.
Пишу выгрузку на портал госзакупок с использованием WinHttpRequest и TLS. Авторизация идет по сертификату

Зачем изобретать велосипед там, где можно использовать stunnel: https://github.com/deemru/stunnel/releases/latest
Знания в базе знаний, поддержка в техподдержке
Offline finex  
#3 Оставлено : 20 сентября 2019 г. 20:51:33(UTC)
finex

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Я правильно понимаю что
Программа stunnel предназначена для шифрования трафика между произвольным приложением на клиентском компьютере, которое работает с некоторым приложением или службой на удаленном компьютере (сервере).
подразумевает установку еще и на сервере и эта служба ставится только на клиенте?
Или же если верить
Настройка Stunnel для взаимодействия с web сервисами ГИС ЖКХ
то достаточно просто установить stunnel на клиенте и указать в параметрах конфига нужные значения
output=C:\stunnel.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7

[https]
client = yes -- признак того что это клиент
accept=localhost:8080 -- это я так понимаю локальный адрес на котором висит stunnel
connect = 217.107.108.147:10081 -тут адрес подключения zakupki.gov.ru
cert=C:\clent.cer -- тут как я понял можно указать ИД сертификата чтобы он его не по имени искал, но как эта штука поймет что надо еще и на флешку заглянуть?
verify=2 -- режим двусторонней проверки



Offline Дмитрий Пичулин  
#4 Оставлено : 20 сентября 2019 г. 22:34:48(UTC)
pd

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC)
Сообщений: 1,440
Откуда: КРИПТО-ПРО

Сказал(а) «Спасибо»: 31 раз
Поблагодарили: 410 раз в 305 постах
Автор: finex Перейти к цитате
Я правильно понимаю что
Программа stunnel предназначена для шифрования трафика между произвольным приложением на клиентском компьютере, которое работает с некоторым приложением или службой на удаленном компьютере (сервере).
подразумевает установку еще и на сервере и эта служба ставится только на клиенте?
Или же если верить
Настройка Stunnel для взаимодействия с web сервисами ГИС ЖКХ
то достаточно просто установить stunnel на клиенте и указать в параметрах конфига нужные значения
output=C:\stunnel.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7

[https]
client = yes -- признак того что это клиент
accept=localhost:8080 -- это я так понимаю локальный адрес на котором висит stunnel
connect = 217.107.108.147:10081 -тут адрес подключения zakupki.gov.ru
cert=C:\clent.cer -- тут как я понял можно указать ИД сертификата чтобы он его не по имени искал, но как эта штука поймет что надо еще и на флешку заглянуть?
verify=2 -- режим двусторонней проверки

Так точно, достаточно установки на клиенте.

Ваш пример конфигурации от старой версии stunnel, версия с github, по ссылке выше, позволяет работать более гибко, например, указывать в опции cert отпечаток сертификата, даже не экспортируя его на диск.

Если хотите работать с 3 пользовательскими сертификатами, создаёте 3 конфигурации на разных портах, например, 127.0.0.1:8081, 127.0.0.1:8082 и 127.0.0.1:8083 с разными необходимыми сертификатами, запускаете stunnel и спокойно работаете, как будто TLS и нет.

Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил pd за этот пост.
finex оставлено 21.09.2019(UTC)
Offline two_oceans  
#5 Оставлено : 23 сентября 2019 г. 7:41:14(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Дополню, старая версия еще и не умеет renegotiation делать. Не пробовал как себя ведет выгрузка на госзакупки, но сам портал госзакупок отваливается на моменте renegotiation, если версия stunnel старая. Еще госзакупки выдают на страницах абсолютные ссылки с протоколом https и без номера порта, то есть при нажатии любой ссылки в браузере браузер переходит на реальный сайт госзакупок и выпадает из тоннеля.

На всякий случай ещё момент, для некоторых серверов используется виртуальный хостинг и требуется точное указание адреса в программе формирующей HTTP (то есть браузер или WinHttp как у Вас), указать просто http://localhost:8080/... не пройдет. В этом случае нужно в файле хостс прописать соответствие допустим zakupki.gov.ru адресу, на котором слушает stunnel (допустим 127.0.0.1), stunnel на порт 80 (или на какой отправляете запрос), а в браузере/WinHttp стандартно http://zakupki.gov.ru/....

Можно еще повесить второй stunnel на порт 443 (с анонимным серверным режимом), соединенный с клиентским stunnel на 8080, тогда можно указать https в браузере и ссылки на госзакупках перестанут выпадать из тоннеля. Минусы - потребуется сертификат сервера с именем zakupki.gov.ru (например от доменного УЦ) и получится использовать только одну конфигурацию и один сертификат пользователя.

Отредактировано пользователем 23 сентября 2019 г. 7:52:09(UTC)  | Причина: Не указана

Offline finex  
#6 Оставлено : 23 сентября 2019 г. 8:39:16(UTC)
finex

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Автор: two_oceans Перейти к цитате
Дополню, старая версия еще и не умеет renegotiation делать. Не пробовал как себя ведет выгрузка на госзакупки, но сам портал госзакупок отваливается на моменте renegotiation, если версия stunnel старая. Еще госзакупки выдают на страницах абсолютные ссылки с протоколом https и без номера порта, то есть при нажатии любой ссылки в браузере браузер переходит на реальный сайт госзакупок и выпадает из тоннеля.

На всякий случай ещё момент, для некоторых серверов используется виртуальный хостинг и требуется точное указание адреса в программе формирующей HTTP (то есть браузер или WinHttp как у Вас), указать просто http://localhost:8080/... не пройдет. В этом случае нужно в файле хостс прописать соответствие допустим zakupki.gov.ru адресу, на котором слушает stunnel (допустим 127.0.0.1), stunnel на порт 80 (или на какой отправляете запрос), а в браузере/WinHttp стандартно http://zakupki.gov.ru/....

Можно еще повесить второй stunnel на порт 443 (с анонимным серверным режимом), соединенный с клиентским stunnel на 8080, тогда можно указать https в браузере и ссылки на госзакупках перестанут выпадать из тоннеля. Минусы - потребуется сертификат сервера с именем zakupki.gov.ru (например от доменного УЦ) и получится использовать только одну конфигурацию и один сертификат пользователя.

Добрый день.
Пока стоит вопрос об использовании в таком режиме только одного сертификата. Другие сертификаты для работы с этим порталом используются для своих задач.
Дословно пользователь работает в системе, формирует план закупок, нажимает кнопку и происходит выгрузка данных.
После этого он подключается в порталу (указывая сертификат или же проскакивая через stunnel) и вносит необходимые корректировки на портале.
Основная задача стоит в том чтобы отправить POST запрос на портал т.к. объем данных для ручного ввода может быть весьма велик

Offline two_oceans  
#7 Оставлено : 23 сентября 2019 г. 13:54:32(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Ситуацию когда хостс изменен Вы наверно неправильно поняли - выйдет только один сертификат для всех задач, так как изменение хостс имеет глобальное значение для всех программ на компьютере (если программа конечно запрашивает адреса через функции Windows, а не шлет собственные DNS запросы, например как nslookup) и сами госзакупки абсолютными ссылками упорно будут "сталкивать" на тот единствеенывй вариант. Разделить один сертификат для этой задачи, два сертификата для других не получится. Поэтому изменение хостс в минусах при наличии нескольких сертификатов.
Offline finex  
#8 Оставлено : 26 сентября 2019 г. 14:36:56(UTC)
finex

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Добрый день.
Stunnel не взлетает.
Вот лог
Код:
[ ] Running on Windows 6.1
[ ] No limit detected for the number of clients
[.] stunnel 5.55 on x64-pc-mingw32-gnu platform
[.] Compiled/running with OpenSSL 1.1.1c  28 May 2019
[.] Threading:WIN32 Sockets:SELECT,IPv6 TLS:ENGINE,OCSP,PSK,SNI
[ ] errno: (*_errno())
[ ] GUI message loop initialized
[ ] Running on Windows 6.1
[.] Reading configuration from file stunnel.conf
[.] UTF-8 byte order mark detected
[ ] Enabling support for engine "capi"
[ ] UI not supported by engine #1 (capi)
[ ] Engine #1 (capi) set as default for ALL
[ ] Initializing engine #1 (capi)
[ ] Engine #1 (capi) initialized
[ ] Compression disabled
[ ] No PRNG seeding was required
[ ] Initializing service [https]
[ ] Ciphers: GOST2012-GOST89-GOST89
[!] SSL_CTX_set_cipher_list: ssl/ssl_lib.c:2549: error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match
[!] Service [https]: Failed to initialize TLS context
[ ] Deallocating section defaults

[!] Server is down


А вот сам конфиг
Код:
output=C:\Stunnel_Log\stun.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
sslVersion=TLSv1.2
taskbar=yes   
DEBUG=7   
engine=capi
;engineCtrl=MODULE_PATH:rtpkcs11ecp.dll   
engineDefault=ALL
;engine = gost
;cert = ‎6953446b1facd380e911f11a21385131
cert=C:\Stunnel_Log\cert.cer
;key = 69:53:44:6b:1f:ac:d3:80:e9:11:f1:1a:21:38:51:31
key = 6953446b1facd380e911f11a21385131
CAfile = SCARD\rutoken_lt_38736919\0A00\FE5E
[https]
client = yes
accept=localhost:8080
connect = int223.zakupki.gov.ru:443
;cert=C:\Stunnel_Log\cert.cer
ciphers = GOST2012-GOST89-GOST89 
TIMEOUTclose = 0
verify=2


Вижу что ему не понятно как работать с ГОСТ 2012, но вот как его прикрутить даже не знаю.

Может у кого то завалялся готовый конфиг под это дело?

В ситуации из шапки попробовал обойти путем использования ПК с единственным сертификатом, но в этом случае запрос возвращает HTTP 500

Версию stunnel брали последнюю

Отредактировано пользователем 26 сентября 2019 г. 14:38:15(UTC)  | Причина: Не указана

Offline finex  
#9 Оставлено : 30 сентября 2019 г. 10:00:40(UTC)
finex

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Разобрался в чем проблема.
Надо было stunnel-msspi ставить, а не версию с гита+gost.dll, т.к. ГОСТ2012 в сертификатах был
Ну и в базе знаний посмотрел простейшие настройки.
Всем спасибо за содействие
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.