1c 7.7 WinHttp.WinHttpRequest: Произошла ошибка безопасности
Есть база 1с 7.7 Торговля+Склад. Раньше была рассылка сообщений смс, сейчас переходим на рассылку в Viber.
Есть адрес коннектора, логин и пароль. Задача - подключиться и передать xml-код. Логин и пароль задаются в тексте xml.
Пытаюсь сделать по аналогии с рассылкой смс:
Ошибка при WinHttp.Send(Текст)
Если указываю https://, то ошибка: WinHttp.WinHttpRequest: Произошла ошибка безопасности
Если указываю http://, то ошибка: WinHttp.WinHttpRequest: Сервер вернул недопустимый или нераспознанный ответ.
Ошибка не меняется от параметров WinHttp.Option() и WinHttp.setRequestHeader(), а также Текста или его отсутствия.
Помогите, куда смотреть, где копать?
UPD:
С http разобралась, был неверно порт указан.
Ошибка с https осталась:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
Есть адрес коннектора, логин и пароль. Задача - подключиться и передать xml-код. Логин и пароль задаются в тексте xml.
Пытаюсь сделать по аналогии с рассылкой смс:
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
//WinHttp.Option(2,"utf-8");
WinHttp.Option(9, 80);
WinHttp .Open("POST","http://......",0);
//WinHttp .Open("POST","https://......",0);
//WinHttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
WinHttp.setRequestHeader("Content-type", "application/xml; charset=utf-8");
//пакет для определения доступности сервиса провайдера
Текст= "<?xml version=""1.0"" encoding=""UTF-8""?>
|<provideServiceStatusRequest>
|<header>
|<auth>
|<login>login</login>
|<password>password</password>
|</auth>
|</header>
|<payload/>
|</provideServiceStatusRequest>";
WinHttp.Send(Текст);
ПоказатьОшибка при WinHttp.Send(Текст)
Если указываю https://, то ошибка: WinHttp.WinHttpRequest: Произошла ошибка безопасности
Если указываю http://, то ошибка: WinHttp.WinHttpRequest: Сервер вернул недопустимый или нераспознанный ответ.
Ошибка не меняется от параметров WinHttp.Option() и WinHttp.setRequestHeader(), а также Текста или его отсутствия.
Помогите, куда смотреть, где копать?
UPD:
С http разобралась, был неверно порт указан.
Ошибка с https осталась:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
WinHttp.Option(9, 80)
512й пробовали ? Его что-то нет в справке
(7)в обработке winhttp open у вас запрос по протоколу http, а ошибку получаете из-за отсутствия сертификата, по всей видимости из-за этого
чтобы понять что там за неверный ответ по 80му порту, поставьте программу FiddlerEverywhere чтобы посмотреть что шлет сервер
чтобы понять что там за неверный ответ по 80му порту, поставьте программу FiddlerEverywhere чтобы посмотреть что шлет сервер
Здесь варианты протоколов есть например
https://support.microsoft.com/ru-ru/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi
0x00000008 Включите SSL 2.0 по умолчанию
0x00000020 Включить SSL 3.0 по умолчанию
0x00000080 Включить TLS 1.0 по умолчанию
0x00000200 Включить TLS 1.1 по умолчанию
0x00000800 Включить TLS 1.2 по умолчанию
Это шестнадцатеричные. Соответственно Option(9, 8) Option(9, 32) Option(9, 128) Option(9, 512) Option(9, 2048)
А Ваш Option(9, 80) - он что значит?
0x00000008 Включите SSL 2.0 по умолчанию
0x00000020 Включить SSL 3.0 по умолчанию
0x00000080 Включить TLS 1.0 по умолчанию
0x00000200 Включить TLS 1.1 по умолчанию
0x00000800 Включить TLS 1.2 по умолчанию
Это шестнадцатеричные. Соответственно Option(9, 8) Option(9, 32) Option(9, 128) Option(9, 512) Option(9, 2048)
А Ваш Option(9, 80) - он что значит?
Администратор хочет переопределить значения по умолчанию для WINHTTP_OPTION_SECURE_PROTOCOLS для указания TLS 1.1 и TLS 1.2. Значение для TLS 1.1 (0x00000200) и значение для TLS 1.2 (0x00000800), затем добавить их вместе в калькулятор (в режиме «Программист») и результирующее значение реестра будет 0x00000A00.
Можно суммы еще делать. WinHttp.Option(9, 512 + 2048) - это TLS 1.1 + TLS 1.2
У http был указан неправильный порт, исправила и заработало без всяких WinHttp.Option() и WinHttp.setRequestHeader().
Рабочий код:
При https по-прежнему ошибка: WinHttp.WinHttpRequest: Произошла ошибка безопасности
Пробовала добавлять авторизацию - не помогло.
WinHttp.SetCredentials(СокрЛП(Логин), СокрЛП(Пароль), 1);
Рабочий код:
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("POST", СокрЛП(Адрес), 0);
Текст = "<?xml version=""1.0"" encoding=""UTF-8""?>
|<provideServiceStatusRequest>
|<header>
|<auth>
|<login>login</login>
|<password>password</password>
|</auth>
|</header>
|<payload/>
|</provideServiceStatusRequest>";
WinHttp.Send(Текст);
ПоказатьПри https по-прежнему ошибка: WinHttp.WinHttpRequest: Произошла ошибка безопасности
Пробовала добавлять авторизацию - не помогло.
WinHttp.SetCredentials(СокрЛП(Логин), СокрЛП(Пароль), 1);
Похоже, что в виде WinHttp.Option(9, 80) - действие вообще ни на что не влияет. И даже правильные числа WinHttp.Option(9, 2048) - тоже не влияют. Нужно писать WinHttp.Option(9)=2048. Но на вашей операционке это не сработает. Такое работает например на Windows-10.
А, http сработал? Повезло значит. Главное чтоб не прикрыли, был опыт, что работал по небезопасному http - а потом закрыли лавочку, оставили только https. Потому как http очень легко перехватить и посмотреть что Вы там шлете.
(1)
И попробуйте опции установить с помощью скрипта:
Может, действительно, конструкция вида:
у вас вообще не работает
И попробуйте опции установить с помощью скрипта:
Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(2)=1251");
Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
Может, действительно, конструкция вида:
WinHttp.Option(9, 80);
у вас вообще не работает
Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(2)=1251");
Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(2)=1251");
Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
тоже самое(
(48)Нужно поставить обновление windows, которое включает поддержку TLS 1.2, вручную поправить реестр и использовать Скрипт.Eval("WinHttp.Option(9)=0"); Это если проблема в том, что сайт не разрешает старый TLS использовать. Судя по "Произошла ошибка безопасности" - так и есть. Для уверенности, что проблема в старом TLS, попробуйте
WinHttp.Open("GET", "https://telegram.org", false);
или
WinHttp.Open("GET", "https://nationalbank.kz/rss/get_rates.cfm?fdate=15.11.2020", false);
Эти порталы тоже не разрешают старый TLS - т.е. ошибка должна быть такая же. И эти порталы начинают работать, если проделать приведенные выше действия. Проверено на Windows Server 2008 R2 Enterprise SP1 (Build 7601)
WinHttp.Open("GET", "https://telegram.org", false);
или
WinHttp.Open("GET", "https://nationalbank.kz/rss/get_rates.cfm?fdate=15.11.2020", false);
Эти порталы тоже не разрешают старый TLS - т.е. ошибка должна быть такая же. И эти порталы начинают работать, если проделать приведенные выше действия. Проверено на Windows Server 2008 R2 Enterprise SP1 (Build 7601)
(23)
Есть у меня тоже один сайт, который никак WinHttp.Option(4) не воспринимает.
Я пользуюсь отладчиком HTTP-запросов Fiddler
Заметил, что когда отладчик запущен, то запрос отрабатывал без проблем.
Единственно, я еще перед вызовом Send() указал параметры Прокси-сервера
Fiddler сам подкачивает необходимый сертификат и запрос отрабатывал.
Я немного перестроил запрос к данному сайту. Стал сначала запускать Fiddler, а потом отправлял запрос.После получения тела выгружаю fiddler из памяти
Такой вот костыль.
Есть у меня тоже один сайт, который никак WinHttp.Option(4) не воспринимает.
Я пользуюсь отладчиком HTTP-запросов Fiddler
Заметил, что когда отладчик запущен, то запрос отрабатывал без проблем.
Единственно, я еще перед вызовом Send() указал параметры Прокси-сервера
WinHttp.SetProxy(2,"127.0.0.1:8888");
Fiddler сам подкачивает необходимый сертификат и запрос отрабатывал.
Я немного перестроил запрос к данному сайту. Стал сначала запускать Fiddler, а потом отправлял запрос.После получения тела выгружаю fiddler из памяти
Такой вот костыль.
(26) Вот например https://api.telegram.org - отказывается работать кроме как TLS 1.2 - т.е. там проблема не с доверием к самподписанному или еще какому нибудь сертификату сервера, а проблема что WinHTTP на винде 7 / 2008 не работает по умолчанию с TLS 1.2 Помогла правка реестра как например тут https://infostart.ru/1c/articles/1024217/ - после нее пошел процесс.
(27)
Вот даже сейчас. У меня стоит Windows 7 Макс.
Параметры реестра изhttps://infostart.ru/1c/articles/1024217/ выставлены.
Есть у нас портал НацБанка Казахстанаhttps://nationalbank.kz . Недавно они что-то изменили у себя в безопасности и теперь не получается получить GET-запросом ресурс с курсом валют
"rss/get_rates.cfm?fdate=" + фДата. фДата - дата в формате "ЧЧ.ММ.ГГГГ"
Но если я загружу Fiddler и прописываю прокси, то файл ко мне прилетает.
Вот даже сейчас. У меня стоит Windows 7 Макс.
Параметры реестра из
Есть у нас портал НацБанка Казахстана
"rss/get_rates.cfm?fdate=" + фДата. фДата - дата в формате "ЧЧ.ММ.ГГГГ"
Но если я загружу Fiddler и прописываю прокси, то файл ко мне прилетает.
(32) Не знаю как на 7.7, а на 8.3.17 WinHttp.Option(x,x) ничего не меняет
Сообщения:
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Сообщить(WinHttp.Option(2));
Сообщить(ТипЗнч(WinHttp.Option(2)));
WinHttp.Option(2, 1251);
Сообщить(WinHttp.Option(2));
Сообщить(WinHttp.Option(4));
Сообщить(ТипЗнч(WinHttp.Option(4)));
WinHttp.Option(4, 13056);
Сообщить(WinHttp.Option(4));
ПоказатьСообщения:
65 001
Число
65 001
0
Число
0
Число
65 001
0
Число
0
(34) Наверное, потому-что я устанавливаю эти параметры через java
Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(2)=1251");
Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
(35) Вот так без фидлера работает Ваш случай на 8.3.17:
Сообщение:
Несмотря на правку реестра, когда используешь WinHttp из эски - у меня она все равно по TLS 1.0 работает. То, что я выше писал, что правка реестра помогала - там я COM из VBScript использовал - там COM после правки реестра сразу на TLS 1.2 переходил. А вот эске моей правка реестра сразу не помогла. Option(9)=2048 невозможно даже после правки реестра на Windows 7 / 2008. Но помог сброс в ноль Option(9)=0 - он заставил WinHttp, вызванный из эски тоже работать по умолчанию по TLS 1.2. Предварительно нужно поправить реестр на работу с TLS 1.2
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(9)=0");
WinHttp.Open("GET", "https://nationalbank.kz/rss/get_rates.cfm?fdate=15.11.2020", false);
WinHttp.Send();
Сообщить (WinHttp.responseText);
ПоказатьСообщение:
<?xml version="1.0" encoding="utf-8"?>
<rates>
<generator>Alternate RSS Builder</generator>
<title>Official exchange rates of National Bank of Republic Kazakhstan</title>
[*]www.nationalbank.kz
<description>Official exchange rates of National Bank of Republic Kazakhstan</description>
<copyright>www.nationalbank.kz</copyright>
<date>15.11.2020</date>
<item>
<fullname>АВСТРАЛИЙСКИЙ ДОЛЛАР</fullname>
<title>AUD</title>
<description>312.17</description>
...
Показать<rates>
<generator>Alternate RSS Builder</generator>
<title>Official exchange rates of National Bank of Republic Kazakhstan</title>
[*]www.nationalbank.kz
<description>Official exchange rates of National Bank of Republic Kazakhstan</description>
<copyright>www.nationalbank.kz</copyright>
<date>15.11.2020</date>
<item>
<fullname>АВСТРАЛИЙСКИЙ ДОЛЛАР</fullname>
<title>AUD</title>
<description>312.17</description>
...
Несмотря на правку реестра, когда используешь WinHttp из эски - у меня она все равно по TLS 1.0 работает. То, что я выше писал, что правка реестра помогала - там я COM из VBScript использовал - там COM после правки реестра сразу на TLS 1.2 переходил. А вот эске моей правка реестра сразу не помогла. Option(9)=2048 невозможно даже после правки реестра на Windows 7 / 2008. Но помог сброс в ноль Option(9)=0 - он заставил WinHttp, вызванный из эски тоже работать по умолчанию по TLS 1.2. Предварительно нужно поправить реестр на работу с TLS 1.2
(36) Получилось валюту получить.
Пришлось правда обновление накатить:
ссылка для обновлений c сайта microsoft
http://www.catalog.update.microsoft.com/search.aspx?q=kb3140245
Комментарий от slavik27
https://infostart.ru/1c/articles/1024217/
Я знал, что решение где-то рядом.
Спасибо за наводку
А то уже надоел этот костыль с Fiddler-ом
Теперь буду пробовать на Server 2008 и уже с другим порталом. Но это уже позже.
Пришлось правда обновление накатить:
ссылка для обновлений c сайта microsoft
Комментарий от slavik27
Я знал, что решение где-то рядом.
Спасибо за наводку
WinHttp.Option(9)=0
А то уже надоел этот костыль с Fiddler-ом
Теперь буду пробовать на Server 2008 и уже с другим порталом. Но это уже позже.
Похоже только обновление нужно было поставить и установить параметры реестра
http://www.catalog.update.microsoft.com/search.aspx?q=kb3140245
Комментарий от slavik27
https://infostart.ru/1c/articles/1024217/
Потому-что, вообще убрал параметры
Все-равно все работает.
Комментарий от slavik27
Потому-что, вообще убрал параметры
WinHttp.Option(9)=0
WinHttp.Option(4)=13056
Все-равно все работает.
(39) http://www.catalog.update.microsoft.com/search.aspx?q=kb3140245
Комментарий от slavik27
https://infostart.ru/1c/articles/1024217/
Тоже на эту статью наткнулась. Мне вот интересно, после всех этих обновлений у меня будут смс-ки отправляться, которые сейчас прекрасно работают по https.
Комментарий от slavik27
Тоже на эту статью наткнулась. Мне вот интересно, после всех этих обновлений у меня будут смс-ки отправляться, которые сейчас прекрасно работают по https.
СоединениеИнтис = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
СоединениеИнтис.Option(9,80);
СоединениеИнтис.Open("POST","https://my.sms16.ru/xml/",0);
СоединениеИнтис.setRequestHeader("Content-Type","text/xml; charset=Windows-1251");
СоединениеИнтис.Send(Текст);
А вот если вызывать COM из VBScript - то там да, не нужен никакой Option(9)=0 - достаточно просто правки реестра (обновления автоматом устанавливаются). Видимо, 7.7 работает как VBScript - после правки реестра автоматом подхватывается TLS 1.2
(40)
И значения параметров должны быть
"DefaultSecureProtocols"=dword:00000A00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800
"DefaultSecureProtocols"=dword:00000800
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800
И значения параметров должны быть
"DefaultSecureProtocols"=dword:00000A00
(45)Да, все это есть. Хоть 800 хоть A00 - все равно. Если закомментить //Скрипт.Eval("WinHttp.Option(9)=0"); - то запускает TLS 1.0 - из 8.3.17 и возникает ошибка. А если написать файлик.vbs и запустить его - то получает курсы. Внутри файлика четыре строчки, без Option:
Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttp.Open "GET", "https://nationalbank.kz/rss/get_rates.cfm?fdate=15.11.2020", false
WinHttp.Send()
MsgBox WinHttp.responseText
(45) Вот еще нашел как без фидлера посмотреть версию TLS, под которой WinHTTP работает: https://stackoverflow.com/questions/34997849/classic-asp-outbound-tls-1-2/39170683#39170683
Сообщения:
Server 2008 R2 SP1, 1С:Предприятие 8.3 (8.3.17.1496), в регистр предварительно внесены правки для работы TLS 1.2
&НаСервереБезКонтекста
Процедура ВерсияТЛСНаСервере()
// пробую TLS 1.2
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(9)=0");
WinHttp.Open("GET", "https://howsmyssl.com/a/check", false);
WinHttp.Send();
Сообщить (Прав(WinHttp.responseText, 39));
// TLS без указаний
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://howsmyssl.com/a/check", false);
WinHttp.Send();
Сообщить (Прав(WinHttp.responseText, 39));
КонецПроцедуры
ПоказатьСообщения:
"tls_version":"TLS 1.2","rating":"Bad"}
"tls_version":"TLS 1.0","rating":"Bad"}
"tls_version":"TLS 1.0","rating":"Bad"}
Server 2008 R2 SP1, 1С:Предприятие 8.3 (8.3.17.1496), в регистр предварительно внесены правки для работы TLS 1.2
(53)
У меня продолжается борьба с админом, говорит, что все установил, но пользы никакой.
Попробовала из 1с запустить ваш код. Если Со скриптом, то выдает ошибку, как и была при подключении по https:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
А если без скрипта, то
"tls_version":"TLS 1.2","rating":"Bad"}
Прав(WinHttp.responseText, 39)
У меня продолжается борьба с админом, говорит, что все установил, но пользы никакой.
Попробовала из 1с запустить ваш код. Если Со скриптом, то выдает ошибку, как и была при подключении по https:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
А если без скрипта, то
"tls_version":"TLS 1.2","rating":"Bad"}
(56) Да, TLS теперь 1.2, но что делать с "rating":"Bad"?
Админ мне прислал ссылкуhttps://clienttest.ssllabs.com:8443/ssltest/viewMyClient.html , где зелененьким горит, что все хорошо и на этом исчез.
Ошибка при попытке отправить сообщения по https по-прежнему остается:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
Админ мне прислал ссылку
Ошибка при попытке отправить сообщения по https по-прежнему остается:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
(45)но если запустить файл test.vbs с аналогичным содержанием
То оба раза выдаст "tls_version":"TLS 1.2"
'trying TLS 1.2
Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttp.Open "GET", "https://howsmyssl.com/a/check", false
Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
ScriptControl.language="javascript"
ScriptControl.AddObject "WinHttp", WinHttp
ScriptControl.Eval "WinHttp.Option(9)=0"
WinHttp.Send()
MsgBox Right(WinHttp.responseText,39)
'TLS by default
Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttp.Open "GET", "https://howsmyssl.com/a/check", false
WinHttp.Send()
MsgBox Right(WinHttp.responseText,39)
ПоказатьТо оба раза выдаст "tls_version":"TLS 1.2"
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот