|
HTTPS\POST запросы | ☑ | ||
---|---|---|---|---|
0
Ferromag
05.09.12
✎
04:19
|
Добрый день,
Нужна помощь экспертов в решении следующей задачи: Дано: SSL сертификат безопасности(установлен и в вин, и в ИЕ) сервер принимающий пост запросы: https://primer.ru:8443/protocol.aspx Соответственно HTTPS POST с кодировкой utf-8. Нужно отправить в ПОСТ запросе набор параметров, например параметр method и значение check. Погуглив тему, информации по пост запросам bp 1C крайне мало, особенно что касается защищенных каналов. при чем 2 основных технологии: 1. Через WinHHTP объект (что мне больше визуально нравится) 2. Формирование файлика с запросом и загрузка его на сервер (оч сильно смущает, что сервер примет файлик запроса) ---- WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); Попытка WinHttp.Open("POST","https://primer.ru:8443/protocol.aspx",0); WinHttp.Option(9,80); WinHttp.setRequestHeader("X-Eport-Auth", "point=ххххх; card=хххххх-ххххх; pin=хххххххххх"); WinHttp.setRequestHeader("X-Eport-Mode","1"); WinHttp.SetRequestHeader("Accept-Language", "ru"); WinHttp.SetRequestHeader("Accept-Charset","Utf-8"); WinHttp.setRequestHeader("Content-Language", "ru"); WinHttp.setRequestHeader("Content-Charset", "Utf-8"); WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Utf-8"); Параметры = "method=check"; WinHttp.Send(Параметры); Сообщить(WinHttp.ResponseText()); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; ----- Выпадает с ошибкой Истекло время ожидание. Как мне кажется, порт соединения должен как-то отдельно фиксироваться. Через браузер по-крайней мере простое обращение к указанному адресу выдает XML ответ о неверном сертификате, а вот с 1С с указанным выше вариант вообще результат печальный. Заранее спасибо тем, кто откликнется по существу. |
|||
1
smaharbA
05.09.12
✎
07:40
|
//*******************************************
Функция ПолучитьОбертку() ХТМЛ = Новый COMОбъект("htmlfile"); ХТМЛ.Open("text/html"); //<-- Подготовим нужные методы ХТМЛ.Write("<script> |var ХТМЛ; |Опция=function(x,y,z){var ret=x.Option(y);if(z) x.Option(y)=z; return ret}; |Записать=function(x,y){x.Write(y.responseBody())}; |</script>"); Док=ХТМЛ.documentElement.document; // Внедрение объекта Скрипта в самого себя, для сохранности контекста Док.script.ХТМЛ=ХТМЛ; // Все подготовке --> Возврат Док.script; КонецФункции // ПолучитьОбертку(Это) //******************************************* Процедура Сформировать() Это=ПолучитьОбертку(); ХТТП = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); ХТТП.Open("POST","https://195.225.172.217:8080/screenshot/yUXnR42J?password=",0); //ХТТП.Open("GET","http://www.n-d.ru/pub/macosx.jpg",0); Это.Опция(ХТТП,2,"Windows-1251"); Это.Опция(ХТТП,4,13056); ХТТП.SetRequestHeader("Accept-Language", "ru"); ХТТП.SetRequestHeader("Accept-Charset","Windows-1251"); ХТТП.setRequestHeader("Content-Language", "ru"); ХТТП.setRequestHeader("Content-Charset", "Windows-1251"); ХТТП.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Windows-1251"); ПараметрыПОСТ = "fruit3=apple777"; ХТТП.Send(ПараметрыПОСТ); //ХТТП.Send(); Сообщить(ХТТП.getAllResponseHeaders()); |
|||
2
Asmody
05.09.12
✎
08:02
|
(1) а теперь то же самое, но нативными средствами
|
|||
3
smaharbA
05.09.12
✎
08:08
|
(2) а чего, третий параметр заголовки, а так представления не имею как с хттпс нативно работать - не адинеснег я
|
|||
4
Ferromag
05.09.12
✎
08:16
|
Спасибо, но пока только
{Форма.Форма(45)}: Ошибка при вызове метода контекста (Send): Произошла исключительная ситуация (WinHttp.WinHttpRequest): Время ожидания операции истекло Я может быть не до конца конечно понимаю технологию, но возможно где-то нужно еще передавать сертификат. Потому что, когда я открывал этот сервер через ИЕ, он мне выдавал запрос на выбор сертификата (где он был правда единственный установленный). Я конечно понимаю, что мне еще нужно решить проблему с сертификатом, но ИЕ как минимум возвращает следующий код <?xml version="1.0" encoding="utf-8" ?> <Result OperationState="10">Передан некорректный сертификат</Result> Это даже без передачи параметров. Пробывал и в коде сенд сделать без передачи - результат тот же, вышло время ожидания. Вот как был переписан мой код по примеру выше: Функция ПолучитьОбертку() ХТМЛ = Новый COMОбъект("htmlfile"); ХТМЛ.Open("text/html"); //<-- Подготовим нужные методы ХТМЛ.Write("<script> |var ХТМЛ; |Опция=function(x,y,z){var ret=x.Option(y);if(z) x.Option(y)=z; return ret}; |Записать=function(x,y){x.Write(y.responseBody())}; |</script>"); Док=ХТМЛ.documentElement.document; // Внедрение объекта Скрипта в самого себя, для сохранности контекста Док.script.ХТМЛ=ХТМЛ; // Все подготовке --> Возврат Док.script; КонецФункции // ПолучитьОбертку(Это) Процедура КнопкаВыполнитьНажатие(Кнопка) //******************************************* Это=ПолучитьОбертку(); Попытка ХТТП = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); ХТТП.Open("POST","https://primer.ru:8443/protocol.aspx",0); Это.Опция(ХТТП,2,"utf-8"); Это.Опция(ХТТП,4,13056); ХТТП.SetRequestHeader("Accept-Language", "ru"); ХТТП.SetRequestHeader("Accept-Charset","utf-8"); ХТТП.setRequestHeader("Content-Language", "ru"); ХТТП.setRequestHeader("Content-Charset", "utf-8"); ХТТП.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Utf-8"); //ПараметрыПОСТ = "method=check"; ХТТП.Send(); //ХТТП.Send(); Сообщить(ХТТП.getAllResponseHeaders()); Исключение Сообщить("Нет связи с сервером"); Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры В фаирволле не думаю же что-то надо еще отдельно прописывать, потому что все отдельные махинации с этим портом заканчивались тем, что была ошибка не удается установить соединение с сервером. |
|||
5
smaharbA
05.09.12
✎
08:21
|
прокси ?
|
|||
6
Ferromag
05.09.12
✎
08:27
|
Прокси есть, но для служб HTTP и HTTPS стоит NAT трансляция, соответственно такой код (ниже) без явного указания прокси спокойно работал. Правда это был другой абсолютно сервер, с передачей GET запросов.
WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); Попытка WinHttp.Open("GET","https://primer2.ru/protocol.aspx?"+param1,0); WinHttp.SetCredentials("login","pass",0); WinHttp.Option(9,80); WinHttp.setRequestHeader("X-Eport-Auth","point=ххххх; card=хххххх-ххххх; pin=хххххххххх"); WinHttp.setRequestHeader("X-Eport-Mode","1"); WinHttp.setRequestHeader("Content-Type","text/xml; charset=Windows-1251"); WinHttp.Send(""); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; |
|||
7
smaharbA
05.09.12
✎
08:28
|
(6) а теперь найдите одно отличие в УРЛ
|
|||
8
Ferromag
05.09.12
✎
08:40
|
Ну да, тут явно не указан порт для SSL, была мысль на счет него. Но куда его пристроить тогда не совсем понятно становится.
И когда я создаю правило для порта, что любой источник, любой приемник может по нему общаться, пробывал при чем и с включенной НАТ, и с выключенной (но тогда по идее надо указывать уже как-то явно для него прокис) - результат был одинаков: {Форма.Форма(45)}: Ошибка при вызове метода контекста (Send): Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером И в итоге я вернулся к тому варианту, с которого и начал) --------------------------- Написав это, решил перепроверить еще разок все и тут же взглянув на свои тестовые правила обнаружил косяк... Галочка разрешить не стояла все это время для порта, вот и блочились все пакеты. Спасибо большое за помощь, теперь наконец-то получил результат аналогичный ИЕ. |
|||
9
Ferromag
05.09.12
✎
08:42
|
Голова просто уже кругом идет, когда в последний момент получаешь пачку бумаг и узнаешь, что все в корни меняется и нужно все срочно переделать, еще и постоянно так дергают по всяким мелочам. Спасибо еще раз, как минимум заставило еще раз чуть более свежим взглядом посмотреть на вещи)
|
|||
10
smaharbA
05.09.12
✎
08:48
|
если есть прокси, просче явно задать прокси
да, в (1) ошибка нужно не Это.Опция(ХТТП,2,"Windows-1251"); а Это.Опция(ХТТП,2,65001);//для утф8 |
|||
11
Ferromag
05.09.12
✎
08:56
|
Это.Опция(ХТТП,2,"utf-8");
Это.Опция(ХТТП,4,13056); у меня сейчас 2 таких строки, я так переделал пример) Первую я так понял надо заменить на Это.Опция(ХТТП,2,65001);//для утф8 А 2ю оставить как есть? Потому что назначение второй строки я не знаю. Явное определение прокси будет получается так? ХТТП.SetProxy(0,"ай_пи_прокси:порт_прокси"); В любом случае проблема была именно в закрытом SSL порте. Меня и поставило в тупик то, что как я считал, открывая его, связь с сервером вообще полностью пропадает. |
|||
12
smaharbA
05.09.12
✎
11:23
|
(11) кодировки задаются численным кодом
1251 == windows-125 65001 == utf8 вторая опция задает игнор для не доверенных сертификатов |
|||
13
smaharbA
05.09.12
✎
11:24
|
т.е. не игнор, а работу даже если сертификат просрочен или отзозван
|
|||
14
Ferromag
06.09.12
✎
02:49
|
Очень благодарен за помощь и разъяснения, спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |