Вход | Регистрация
 

Windows 10, WinHttpRequest и сертификаты

Windows 10, WinHttpRequest и сертификаты
Я
   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 - то же самое. Обращение к тому же адресу через веб-браузер проходит без проблем.

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

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

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

(5) попробуй по методу Сергея Смирнова "подключить" к 1С .NET. Многие вещи сразу станет делать проще
   Garykom
 
9 - 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.
   fjay69
 
11 - 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

   fjay69
 
12 - 11.08.19 - 12:37
[1С]Шелл = Новый COMОбъект("WScript.Shell");
ИмяОС = Шелл.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName");
Если Найти(ИмяОС, "Windows 10")<>0 Тогда[/1С]

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.