Форум КриптоПро
»
Средства криптографической защиты информации
»
Другие продукты
»
WinHttpRequest и Zakupki.gov.ru и сертификаты с одинаковыми именами
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC) Сообщений: 1,528 Откуда: КРИПТО-ПРО
Сказал(а) «Спасибо»: 35 раз Поблагодарили: 489 раз в 348 постах
|
Автор: finex  Доброго времени суток. Пишу выгрузку на портал госзакупок с использованием WinHttpRequest и TLS. Авторизация идет по сертификату Зачем изобретать велосипед там, где можно использовать stunnel: https://github.com/deemru/stunnel/releases/latest |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 -- режим двусторонней проверки
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC) Сообщений: 1,528 Откуда: КРИПТО-ПРО
Сказал(а) «Спасибо»: 35 раз Поблагодарили: 489 раз в 348 постах
|
Автор: 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 и нет. |
|
 1 пользователь поблагодарил pd за этот пост.
|
finex оставлено 21.09.2019(UTC)
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 запрос на портал т.к. объем данных для ручного ввода может быть весьма велик
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Ситуацию когда хостс изменен Вы наверно неправильно поняли - выйдет только один сертификат для всех задач, так как изменение хостс имеет глобальное значение для всех программ на компьютере (если программа конечно запрашивает адреса через функции Windows, а не шлет собственные DNS запросы, например как nslookup) и сами госзакупки абсолютными ссылками упорно будут "сталкивать" на тот единствеенывй вариант. Разделить один сертификат для этой задачи, два сертификата для других не получится. Поэтому изменение хостс в минусах при наличии нескольких сертификатов.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.04.2015(UTC) Сообщений: 14  Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз
|
Разобрался в чем проблема. Надо было stunnel-msspi ставить, а не версию с гита+gost.dll, т.к. ГОСТ2012 в сертификатах был Ну и в базе знаний посмотрел простейшие настройки. Всем спасибо за содействие
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Другие продукты
»
WinHttpRequest и Zakupki.gov.ru и сертификаты с одинаковыми именами
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close