Имя: Пароль:
IT
 
Windows 10, WinHttpRequest и сертификаты
,
0 fjay69
 
09.08.19
20:13
Добрый вечер. Потребовалось выполнять зашифрованные POST запросы. В виду некоторых обстоятельств нет возможности использовать встроенные механизмы платформы 1с 8.3, поэтому делал через WinHttpRequest. И если на Windows 7 всё работает, то же самое на Windows 10 работать не хочет. Вот примерный код:

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");    
WinHttp.SetClientCertificate("CURRENT_USER\My\123456");//Личный сертификат pfx с закрытым ключом
WinHttp.Open("POST", Адрес, 0);
WinHttp.SetCredentials(Логин, Пароль, 0);
WinHttp.SetTimeouts(10000, 10000, 30000, 30000);
WinHttp.SetRequestHeader("Content-type", "text/plain");


После вызова метода Send(Запрос) вылезает исключительная ситуация "Произошла ошибка безопасности". Пробовал msxml2.serverxmlhttp - то же самое. Обращение к тому же адресу через веб-браузер проходит без проблем.

Помогите, пожалуйста.
1 Глок 17
 
09.08.19
21:39
Может сертификат нужно добавить в папку "доверенные" или как-то так. Не помню уже. Как предположение.
2 Garykom
 
гуру
09.08.19
22:53
(0) "CURRENT_USER\My\123456" - вот тут ошибка или у пользователя от которого запускается WinHttp нет прав доступа на ветку реестра с сертификатом.
3 fjay69
 
10.08.19
10:59
(2) Повторяю, вышеприведённый код работает под Windows 7, но не работает под Windows 10. Код запускаю под собой на домашнем компьютере. Уж у меня-то должны быть все права.
4 ShAV
 
10.08.19
12:10
Есть там какая-то бяка в Windows 10. Я пробовал только без компонент. Подключал библиотеку openssl и была непонятная ошибка именно на этапе отправки запроса. Как решить не нашел, но понял, что это что-то с работой сертификатами. Такое впечатление, что винда закрывает сокет в момент непосредственно перед отправкой запроса из-за сертификатов, хотя до этого без проблем позволила открыть и установить соединение с удаленным сервером. Ответа в инете не нашел.

Пока забросил из-за текущей работы с 1С.
5 fjay69
 
10.08.19
13:08
Попробовал в C# через HttpWebRequest. Соединение проходит, если установить SecurityProtocol = TLS или TLS11. При TLS12 И SSL3 даёт "Не удалось создать защищенный канал SSL/TLS".
6 fjay69
 
10.08.19
13:15
Я это сделал! Добавляем в код следующее:
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language="javascript";    
    Скрипт.AddObject("WinHttp", WinHttp);
    Скрипт.Eval("WinHttp.Option(9)=512");

Этот код устанавливает протокол безопасности TLS 1.1 и запрос проходит.
7 Garykom
 
гуру
10.08.19
16:26
Просто:
WinHttp.Option(9, 512);

Не срабатывает? Обязательно надо через внешний скрипт установить?
8 oleg_km
 
10.08.19
17:23
(7) Так вроде не срабатывает. Приходится извращаться со скриптами. Я вообще WinHTTP API заворачивал в КОМ. Сейчас пользуюсь дот нетом.

(5) попробуй по методу Сергея Смирнова "подключить" к 1С .NET. Многие вещи сразу станет делать проще
9 Garykom
 
гуру
10.08.19
17:56
(8) Это требуется ВК каким то образом доставить, зарегать и только потом можно из 1С юзать, если речь про
http://catalog.mista.ru/public/448668/
Не спорю что потом просто супер вся мощь классов .Net есть.

Можно конечно и без ВК извратиться через
http://catalog.mista.ru/public/16898/
http://forum.script-coding.com/viewtopic.php?id=1139
10 Сияющий в темноте
 
10.08.19
18:41
там,по идее, set_Option должно отработать,т.к.1с не умеет корректно работать с Lvalue.
11 fjay69
 
11.08.19
11:17
(7) Да, нужно извращаться со скриптами.

(8) Знаю эту тему, но разбираться некогда.

Вот ещё любопытной информации. (6) Не будет работать под Windows 7. Точнее, будет, но потребуется зарегить COM-Компоненту (https://osergey.ru/ru/call-32-bit-com-objects-to-side-64-bi/#more-508), а также заменить 512 (TLS 1.1) на 128 (TLS 1.0). Посему возникла надобность определять версию ОС. Как правильно это сделать?

Если Лев(СистемнаяИнформация.ВерсияОС, 11)="version 6.2" Тогда //Windows 10
12 fjay69
 
11.08.19
12:37
Шелл = Новый COMОбъект("WScript.Shell");
ИмяОС = Шелл.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName");
Если Найти(ИмяОС, "Windows 10")<>0 Тогда
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.