1c 7.7 WinHttp.WinHttpRequest: Произошла ошибка безопасности

1. emorozova 16 14.11.20 20:13 Сейчас в теме
Есть база 1с 7.7 Торговля+Склад. Раньше была рассылка сообщений смс, сейчас переходим на рассылку в Viber.
Есть адрес коннектора, логин и пароль. Задача - подключиться и передать 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: Произошла ошибка безопасности
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. uno-c 237 14.11.20 20:31 Сейчас в теме
Ошибка не меняется от параметров WinHttp.Option()
Т.е. совсем без option тоже не работает?
3. emorozova 16 14.11.20 20:51 Сейчас в теме
(2) Да хоть все закомментировать и оставит только Open и Send - те же ошибки:

при https: WinHttp.WinHttpRequest: Произошла ошибка безопасности

при http: WinHttp.WinHttpRequest: Сервер вернул недопустимый или нераспознанный ответ
4. uno-c 237 14.11.20 21:10 Сейчас в теме
а у них сертификат не самоподписанный?
5. uno-c 237 14.11.20 21:20 Сейчас в теме
WinHttp.Option(9, 80)
512й пробовали ? Его что-то нет в справке https://docs.microsoft.com/ru-ru/windows/win32/winhttp/winhttprequestoption . Это TLS 1.1 - WinHttp.Option(9, 512)
7. emorozova 16 14.11.20 21:38 Сейчас в теме
(5)
WinHttp.Option(9, 512)


все то же самое(
33. stelio 16.11.20 18:24 Сейчас в теме
(7)в обработке winhttp open у вас запрос по протоколу http, а ошибку получаете из-за отсутствия сертификата, по всей видимости из-за этого

чтобы понять что там за неверный ответ по 80му порту, поставьте программу FiddlerEverywhere чтобы посмотреть что шлет сервер
6. uno-c 237 14.11.20 21:38 Сейчас в теме
Здесь варианты протоколов есть например
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) - он что значит?
8. emorozova 16 14.11.20 21:39 Сейчас в теме
(6)
А Ваш Option(9, 80) - он что значит?


так было при отправке смс
9. uno-c 237 14.11.20 21:40 Сейчас в теме
TLS 1.2 попробовали (9, 2048) ?
10. uno-c 237 14.11.20 21:44 Сейчас в теме
Администратор хочет переопределить значения по умолчанию для 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
11. emorozova 16 14.11.20 23:35 Сейчас в теме
У http был указан неправильный порт, исправила и заработало без всяких WinHttp.Option() и WinHttp.setRequestHeader().

Рабочий код:

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);
12. uno-c 237 14.11.20 23:46 Сейчас в теме
Похоже, что в виде WinHttp.Option(9, 80) - действие вообще ни на что не влияет. И даже правильные числа WinHttp.Option(9, 2048) - тоже не влияют. Нужно писать WinHttp.Option(9)=2048. Но на вашей операционке это не сработает. Такое работает например на Windows-10.
13. uno-c 237 14.11.20 23:49 Сейчас в теме
Это конечно если проблема в версии TLS. Какой адрес портала? Могу проверить - делает ли он отлуп если TLS меньше 1.2 его просить.
50. emorozova 16 19.11.20 00:31 Сейчас в теме
(13)


похоже проблема именно здесь
14. uno-c 237 14.11.20 23:52 Сейчас в теме
А, http сработал? Повезло значит. Главное чтоб не прикрыли, был опыт, что работал по небезопасному http - а потом закрыли лавочку, оставили только https. Потому как http очень легко перехватить и посмотреть что Вы там шлете.
15. emorozova 16 15.11.20 01:04 Сейчас в теме
(14) Вот поэтому тему не закрываю. Надо все-таки с https разобраться :)
16. uno-c 237 15.11.20 01:07 Сейчас в теме
(15)Если проблема с TLS - то реестр надо править - у Вас ведь win-7 ? Win-10 сама по умолчанию TLS 1.2 подставляет. Win-8 видимо тоже.
17. emorozova 16 15.11.20 01:08 Сейчас в теме
18. uno-c 237 15.11.20 01:08 Сейчас в теме
server 2008 - 'то то же что Win-7. Если проблема что сейчас пытается TLS 1.0 а в ответ облом (портал требует 1.1 или 1.2 и отказывается работать по TLS 1.0) - то лечится правкой реестра.
19. uno-c 237 15.11.20 01:18 Сейчас в теме
Что любопытно, на Win-10 работает и WinHttp.Option(9)=2048 и дальше вниз 512, 128, 32, 8. А на 2008м - только от 128 и ниже.
20. vetalk 15.11.20 17:06 Сейчас в теме
для https тоже другой порт надо использовать
21. VladimirB 16 16.11.20 07:55 Сейчас в теме
(1)
А эти опции не пробовали?
WinHttp.Option(2,1251);//CodePage
WinHttp.Option(4,13056);//intSslErrorIgnoreFlags
WinHttp.Option(6,1);// (true) blnEnableRedirects
WinHttp.Option(12,1);// (true) blnEnableHttpsToHttpRedirects
47. emorozova 16 19.11.20 00:00 Сейчас в теме
WinHttp.Option(2,1251);//CodePage
WinHttp.Option(4,13056);//intSslErrorIgnoreFlags
WinHttp.Option(6,1);// (true) blnEnableRedirects
WinHttp.Option(12,1);// (true) blnEnableHttpsToHttpRedirects


все эти опции ничего не меняют(
22. VladimirB 16 16.11.20 08:20 Сейчас в теме
(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); 

у вас вообще не работает
23. emorozova 16 16.11.20 12:32 Сейчас в теме
(22) попробовала, без изменений.
Ошибка при вызове метода Send() при использовании https:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
48. emorozova 16 19.11.20 00:02 Сейчас в теме
Скрипт= СоздатьОбъект("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


тоже самое(
52. uno-c 237 19.11.20 05:30 Сейчас в теме
(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)
24. VladimirB 16 16.11.20 15:15 Сейчас в теме
(23)
Есть у меня тоже один сайт, который никак WinHttp.Option(4) не воспринимает.
Я пользуюсь отладчиком HTTP-запросов Fiddler

Заметил, что когда отладчик запущен, то запрос отрабатывал без проблем.
Единственно, я еще перед вызовом Send() указал параметры Прокси-сервера
WinHttp.SetProxy(2,"127.0.0.1:8888");

Fiddler сам подкачивает необходимый сертификат и запрос отрабатывал.
Я немного перестроил запрос к данному сайту. Стал сначала запускать Fiddler, а потом отправлял запрос.После получения тела выгружаю fiddler из памяти

Такой вот костыль.
25. uno-c 237 16.11.20 15:50 Сейчас в теме
(24)
WinHttp.Option(4) не воспринимает.

Вы по максимуму пробовали? WinHttp.Option(4) = 13056 ?
26. VladimirB 16 16.11.20 15:51 Сейчас в теме
27. uno-c 237 16.11.20 17:04 Сейчас в теме
(26) Вот например https://api.telegram.org - отказывается работать кроме как TLS 1.2 - т.е. там проблема не с доверием к самподписанному или еще какому нибудь сертификату сервера, а проблема что WinHTTP на винде 7 / 2008 не работает по умолчанию с TLS 1.2 Помогла правка реестра как например тут https://infostart.ru/1c/articles/1024217/ - после нее пошел процесс.
51. emorozova 16 19.11.20 00:48 Сейчас в теме
(24)
отладчиком HTTP-запросов Fiddler


я его даже установить на их сервере не могу
28. VladimirB 16 16.11.20 17:11 Сейчас в теме
(27)
Да. я тоже активизировал протоколы TLS 1.1 и TLS 1.2. Но запрос все-равно не работал. Возможно я тоже брал информацию из этой или подобной статьи.
29. VladimirB 16 16.11.20 17:27 Сейчас в теме
(27)
Вот даже сейчас. У меня стоит Windows 7 Макс.
Параметры реестра из https://infostart.ru/1c/articles/1024217/ выставлены.
Есть у нас портал НацБанка Казахстана https://nationalbank.kz . Недавно они что-то изменили у себя в безопасности и теперь не получается получить GET-запросом ресурс с курсом валют
"rss/get_rates.cfm?fdate=" + фДата. фДата - дата в формате "ЧЧ.ММ.ГГГГ"
Но если я загружу Fiddler и прописываю прокси, то файл ко мне прилетает.
30. uno-c 237 16.11.20 17:28 Сейчас в теме
(29) А Вы на 1С 7.7 - зачем WinHTTP ?
31. VladimirB 16 16.11.20 17:30 Сейчас в теме
32. VladimirB 16 16.11.20 17:31 Сейчас в теме
WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
34. uno-c 237 16.11.20 18:27 Сейчас в теме
(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
35. VladimirB 16 16.11.20 18:43 Сейчас в теме
(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
36. uno-c 237 16.11.20 20:15 Сейчас в теме
(35) Вот так без фидлера работает Ваш случай на 8.3.17:
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>
...
Показать


Несмотря на правку реестра, когда используешь 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
VladimirB; +1 Ответить
37. VladimirB 16 17.11.20 08:29 Сейчас в теме
(36) Благодарю. Обязательно проверю.
38. VladimirB 16 17.11.20 10:37 Сейчас в теме
(36) Получилось валюту получить.
Пришлось правда обновление накатить:
ссылка для обновлений c сайта microsoft
http://www.catalog.update.microsoft.com/search.aspx?q=kb3140245
Комментарий от slavik27
https://infostart.ru/1c/articles/1024217/

Я знал, что решение где-то рядом.
Спасибо за наводку
WinHttp.Option(9)=0

А то уже надоел этот костыль с Fiddler-ом
Теперь буду пробовать на Server 2008 и уже с другим порталом. Но это уже позже.
39. VladimirB 16 17.11.20 11:08 Сейчас в теме
Похоже только обновление нужно было поставить и установить параметры реестра


Потому-что, вообще убрал параметры
WinHttp.Option(9)=0
WinHttp.Option(4)=13056

Все-равно все работает.
40. uno-c 237 17.11.20 11:20 Сейчас в теме
(39)У меня на 8.3.17 когда Option(9)=0 убираешь - снова начинает по TLS 1.0 работать и обламывается.
49. emorozova 16 19.11.20 00:21 Сейчас в теме
(39)
Тоже на эту статью наткнулась. Мне вот интересно, после всех этих обновлений у меня будут смс-ки отправляться, которые сейчас прекрасно работают по 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(Текст);
41. uno-c 237 17.11.20 11:22 Сейчас в теме
А вот если вызывать COM из VBScript - то там да, не нужен никакой Option(9)=0 - достаточно просто правки реестра (обновления автоматом устанавливаются). Видимо, 7.7 работает как VBScript - после правки реестра автоматом подхватывается TLS 1.2
42. VladimirB 16 17.11.20 11:26 Сейчас в теме
Я у себя убрал, все работает. Может из-за обновления.
Перезагружать комп не пробовал
43. VladimirB 16 17.11.20 11:26 Сейчас в теме
Хотя перезагрузка думаю не повлияет
44. VladimirB 16 17.11.20 11:29 Сейчас в теме
(40) А параметры реестра выставлены?
45. VladimirB 16 17.11.20 11:31 Сейчас в теме
(40)
[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:00000A00
46. uno-c 237 17.11.20 13:37 Сейчас в теме
(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
53. uno-c 237 19.11.20 07:48 Сейчас в теме
(45) Вот еще нашел как без фидлера посмотреть версию TLS, под которой WinHTTP работает: https://stackoverflow.com/questions/34997849/classic-asp-outbound-tls-1-2/39170683#39170683
&НаСервереБезКонтекста
Процедура ВерсияТЛСНаСервере()
	
// пробую 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"}

Server 2008 R2 SP1, 1С:Предприятие 8.3 (8.3.17.1496), в регистр предварительно внесены правки для работы TLS 1.2
VladimirB; +1 Ответить
55. emorozova 16 03.01.21 13:36 Сейчас в теме
(53)
Прав(WinHttp.responseText, 39)


У меня продолжается борьба с админом, говорит, что все установил, но пользы никакой.

Попробовала из 1с запустить ваш код. Если Со скриптом, то выдает ошибку, как и была при подключении по https:
WinHttp.WinHttpRequest: Произошла ошибка безопасности

А если без скрипта, то
"tls_version":"TLS 1.2","rating":"Bad"}
56. uno-c 237 03.01.21 20:54 Сейчас в теме
(55)
без скрипта, то "tls_version":"TLS 1.2"
Получается, TLS 1.2 - нормальный у Вас.
57. emorozova 16 12.01.21 16:51 Сейчас в теме
(56) Да, TLS теперь 1.2, но что делать с "rating":"Bad"?
Админ мне прислал ссылку https://clienttest.ssllabs.com:8443/ssltest/viewMyClient.html, где зелененьким горит, что все хорошо и на этом исчез.
Ошибка при попытке отправить сообщения по https по-прежнему остается:
WinHttp.WinHttpRequest: Произошла ошибка безопасности
54. uno-c 237 19.11.20 08:14 Сейчас в теме
(45)но если запустить файл test.vbs с аналогичным содержанием
'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"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот