Имя: Пароль:
1C
1С v8
Веб-сервер, https. Как указать необходимый сертификат?
, , ,
0 be-may
 
19.11.12
15:46
Есть веб-сервис.
Обращаюсь к нему через защищенное соединение, использую сертификат с закрытым ключем.

Мне нужно послать xml запрос серверу  (методом POST) и в ответ получить xml ответ.

------

Сейчас все работает через  

xl = Новый COMОбъект("Microsoft.XMLHTTP");
но, проблема в том, что  каждый раз при запуске браузера появляется окно с выбором сертификата, и требуется участие пользователя.. Хотелось от этого уйти.
Как бы так указать, что использовать необходимо  конкретный сертификат?

-----

пробую сделать через

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"Windows-1251");
WinHttp.SetClientCertificate("тут_пишу_имя_сертификата_из_ЛИЧНЫХ_сертификатов");


и все вроде бы прокатывает, но дойдя до отправки xml я не получаю ничего в ответ..

// (дело происходит на 8.1)
Итак, как указать конкретный сертификат для перемнной xl ?
1 oleg_km
 
19.11.12
16:45
У меня именно так и работало. Там где устанавливается использование SSL включено?
2 be-may
 
20.11.12
08:27
(1) Олег (? правильно же имя пишу), вот именно вы мне и нужны. Вчера гору тем на форуме перелопатила на тему установки соединения с веб серверами и практически в каждой высказывались вы.
Подозреваю, что уже не одну собаку съели на этом.
Если
----
Именно так это как? Через "WinHttp.WinHttpRequest ?

SSL 2.0  выключено, SSL 3.0  включено
3 be-may
 
20.11.12
08:47
Расскажу чуть подробней.

Есть некие данные.
Есть несколько сертификатов.
Мне нужно часть данных отправить с одним сертификатом, часть данных с другим сертификатом..

Пробовала, кстати, через WS ссылку делать с прописыванием корневого сертификата в файл сертификатов, который лежит в BIN - в итоге не получилось у меня
4 SergeyKB
 
20.11.12
08:57
(0)
посмотрите здесь :
5 SergeyKB
 
20.11.12
08:57
6 SergeyKB
 
20.11.12
08:57
действовал по аналогии, всё сработало
7 be-may
 
20.11.12
09:14
Если использовать WinHttp.WinHttpRequest , то у меня проблема не с сертификатом, а с тем, что я не могу получить и прочитать от сервера xml
8 be-may
 
20.11.12
09:18
Сейчас примерно такой код.

Код рабочий. В самом начале запускается браузер, выбирается сертификат
Не устраивает в этом именно то, что нужно выбирать руками сертификат.  Раньше он был один - и в принципе, это не было
проблемой, но теперь их стало 2 с перспективой увеличения количества сертификатов дальше. Поэтому, хочется как-то автоматизировать процесс по максимуму


   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();

   xl = Новый COMОбъект("Microsoft.XMLHTTP");
   //xl.setOption(2, 13056);
   xl.Open("GET","https://dealer.beeline.ru/dealer/WebService/DOL.asmx",0);
   xl.send();
   кол =0;
   Статус = xl.readyState;
   
   Пока Статус <> 4  Цикл
       // ...
       // здесь обработка ожидания
       //....
   КонецЦикла;
   
   Если xl.status<>200 тогда
       Сообщить("Ошибка авторизации");
       Возврат;
   КонецЕсли;
   
   Пока Выборка.Следующий() Цикл
       // Формируем XML файл для отправки    
       
       хмл = Новый COMОбъект("Msxml2.DOMDocument");
       хмл.appendChild(хмл.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'"));            
       rootNode              = хмл.appendChild(хмл.createElement("soap:Envelope"));
       rootNode.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
       rootNode.setAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
       rootNode.setAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
       soapBody            = rootNode.appendChild(хмл.createElement("soap:Body"));    
       ReguestStatuses      = soapBody.appendChild(хмл.createElement("ReguestStatuses"));    
       ReguestStatuses.setAttribute("xmlns","http://beeline.ru/ws/dol/2006");
       requests            = ReguestStatuses.appendChild(хмл.createElement("requests"));
       Request              = requests.appendChild(хмл.createElement("Request"));  
       КодТочки            =Выборка.КодТочки;              
       Request.setAttribute("PointCode",КодТочки);
       Request.setAttribute("Code",Сред(ВЫборка.НомерКонтракта,2));
       
       хмл.save("c:\otladka_statusov_8_1.xml");  
       
       xl.Open("POST","https://dealer.beeline.ru/dealer/WebService/DOL.asmx",0);
       xl.send(хмл);
       
       хмл = xl.responseXML;  
       
       // ....
       // далее обработка полученной хмл
       // ....
       
   КонецЦикла;
9 be-may
 
20.11.12
09:28
далее попробовала сделать так :


   WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.Option(2,"Windows-1251");
   WinHttp.SetClientCertificate("_Тут_Имя_серта_");
   WinHttp.Open("GET","https://dealer.beeline.ru/dealer/WebService/DOL.asmx",0);
   WinHttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
   WinHttp.Send();      

   Если WinHttp.status<>200 тогда
       Сообщить("Ошибка авторизации");
       Возврат;
   КонецЕсли;
   

и далее аналогично как в (8)

Авторизация прошла успешно, но я не могу прочитать полученный сервером в ответ хмл.. некуда его принять :)


И вообще пока не сформировала заголовок, сервер мне писал "Unsupported Media Type" в ответ на посланную ему хмл

---
Вот если бы у  COMОбъект("Microsoft.XMLHTTP") был метод SetClientCertificate как у WinHttp.WinHttpRequest или у  WinHttp.WinHttpRequest было бы куда принимать хмл...
Скажите, может есть что-то такое?
10 oleg_km
 
20.11.12
10:19
(9) Не понимаю вопроса, ответ сервера находится в ResponseText, запрос отправляется парамтром в Send

ИмяСертификата = "Польских Светлана Валерьевна";
АдресВебСервиса = "https://filials.payment.ru:9443/OLWSWM/services/OLWS?WSDL";
   
обИнтернет = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
обИнтернет.SetClientCertificate(ИмяСертификата);

обИнтернет.Open("GET", АдресВебСервиса, Ложь);
обИнтернет.Send();
Сообщить(обИнтернет.ResponseText);

msdn почитайте, там достаточно разжевано
11 be-may
 
20.11.12
11:56
(10) а как мне отправить хмл туда?
12 oleg_km
 
20.11.12
12:00
(11) В параметре команды Send()

ИмяСертификата = "Польских Светлана Валерьевна";
АдресВебСервиса = "https://filials.payment.ru:9443/OLWSWM/services/OLWS?WSDL";

   
обИнтернет = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
обИнтернет.SetClientCertificate(ИмяСертификата);

обИнтернет.Open("GET", АдресВебСервиса, Ложь);
обИнтернет.Send("ВОТ СЮДА ПИШИТЕ ТЕКСТ ВАШЕГО XML");
Сообщить(обИнтернет.ResponseText);
13 be-may
 
20.11.12
13:08
(12) все.... решила..

Знаешь в чем дело было ?
(пишу для тех, кто будет идти по моим граблям..)
----
Я сначала создала переменную
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
затем Open , setRequestHeader и Send .  
Сенд был пустой - просто для авторизации..
Если авторизация проходила (статус 200), то все ОК и дальше выполнялись новые  запросы.

А в запросах было снова обращение к ТОЙ ЖЕ переменной WinHttp . Я считала, что я то ее уже создала, заголовки обозначила, значит незачем новую переменную создавать..

Убрала авторизацию - и все стало хорошо. Сервер стал выдавать нужную хмл.

--
Олегу отдельное человеческое спасибо )