Имя: Пароль:
1C
1С v8
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
Очень благодарен за помощь и разъяснения, спасибо