Доступ к веб-серверу по сертификату

helper

#1

Помогите достучаться из 1С до веб-сервиса через сертификат клиента. Уже всё перерыл.

Имеется ресурс: https://svc.mbki.ru/InputService/CHBInput.asmx?WSDL
открыть его можно только в старом IE с выбором валидного сертификата клиента. В моем случае это выглядит вот так:


и далее уже открываются нужные данные, правда сертификат самого сайта подписан тестовым центром крипто-про:

Вопрос: как мне программно из 1С достучаться до этого ресурса?
Делаю вот так:

&НаКлиенте
Процедура Тест(Команда)
	
	СертификатКлиентаВыбор = Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать);
	
	ССЛ = Новый ЗащищенноеСоединениеOpenSSL(
            СертификатКлиентаВыбор               
	);
	
	ХТТПСоединение = Новый HTTPСоединение(
							"SVC.MBKI.RU",
							,
							,
							,
							,
							,
							ССЛ
	);
	
	Запрос = Новый HTTPЗапрос("/InputService/CHBInput.asmx?WSDL");
	Ответ = ХТТПСоединение.Получить(Запрос); 
	СтрокаТела = Ответ.ПолучитьТелоКакСтроку();
	Сообщить(СтрокаТела);
	
КонецПроцедуры

Выбор моего сертификата проходит, но далее вываливается ошибка:

{ВнешняяОбработка.МБКИвебЗапросы.Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (Получить)
Ответ = ХТТПСоединение.Получить(Запрос);
по причине:
Ошибка работы с Интернет: Failure when receiving data from the peer

Помогите, пожалуйста.


#2

первый слеш убери

Новый HTTPЗапрос("InputService/CHBInput.asmx?WSDL");


#3

Ничего не меняется.
В идеале хочется вообще без участия человека делать запрос, т.е. что-то типа

СертификатКлиентаФайл = Новый СертификатКлиентаФайл("d:\tmp\MBKI\my-pem.pem")

Но у меня даже так, с выбором пользователя, не получается, не то что через файл


#4

Я уже подумываю в сторону stunnel посмотреть, но опыта работы с ним вообще нет.
Но судя по описанию, может мне помочь


#5

Peer означает - что ресурс не доступен по соединению. То есть оттуда нет “ресива”.

Вообще-то можно запроксировать - я обычно использую membrane-soa. Никита творил что-то на node.js (пакет не помню)


#6

node-soap+express.js


#7

Звучит страшновато.
Вроде как для такого как я подойдет и stunnel http://www.stunnel.org/index.html
Никто не разбирался с ним конкретно в части тунеля с сертификатом из реестра?


#8

Докладываю о результатах.
Оказывается, родной stunnel не умеет ГОСТ.
Есть прокаченный от Крипто-Про. Брать отсюда: https://www.cryptopro.ru/products/other/stunnel-msspi
Создаем файлик stunnel.conf с примерно таким содержимым:

output = d:\tmp\MBKI\stunnel-log.txt
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
;debug = 7

[stunnel.mbki]
client = yes
accept = 127.0.0.1:8383
connect = svc.mbki.ru:443
cert = d:\tmp\MBKI\my-der.cer
verify = 2

Где d:\tmp\MBKI\my-der.cer - мой сертификат в DER-кодировке

После старта службы изначальный запрос в 1С выглядит вот так:

ХТТПСоединение = Новый HTTPСоединение("127.0.0.1", 8383);
Запрос = Новый HTTPЗапрос("/InputService/CHBInput.asmx?WSDL");
Ответ = ХТТПСоединение.Получить(Запрос);

Никаких защищенных соединений и танцев с сертификатами в коде 1С!


#9

Что и требовалось доказать - проксирование в очередной раз спасло ;-). У тебя получилось быстрей… Я на всякий случай напомню - использование stunnel при развертывании в продуктиве может нарваться на ИБ-шников

Добавь на своей стороне защиты - типа доступа по IP сервера 1С (а лучше локальную петлю.

[PSK client 1]
client = yes
accept = 127.0.0.1:<src_port>
connect = <server_host>:<server_port>
PSKsecrets = psk1.txt

#10

Я б не сказал, что у меня быстро получилось. Наскоками уже не первый день сижу с этой проблемой.
А самая засада была в том, что ванильный stunnel не поддерживал ГОСТ, по которому сформирован наш сертификат. Кто ж знал-то…