2015-05-08 3 views
0

У меня проблема с взаимодействием с сервисом Unistream со стороны SOAP-клиента и с помощью curl.Не удается установить защищенное соединение с SOAP unistream

Моя среда: Ubuntu 15,04, PHP 5,64

Немного истории: поддержка Юнистрим попросили нас генерировать certifiate: Makecert.exe -n "CN = некоторое_имя" -ss Мой обмен -r -m 120 -pe -sky -a sha1, затем экспортировать с помощью mmc end, отправить сертификат им. Хорошо, мы делаем это и получаем сертификат, сгенерированный на их стороне. преобразовать их сертификат PEM-формат и попробуйте использовать это PHP SoapClient:

$soap = new SoapClient("http://test2.unistream.com:82/wcflib-tc/service.svc?wsdl", [ 
    'encoding' => 'UTF-8', 
    'trace' => true, 
    'local_cert' => $cert_path, 
    'soap_version' => SOAP_1_2, 
    'connection_timeout' => 180, 
    'cache_wsdl' => WSDL_CACHE_NONE 
]); 
$data = $soap->GetCountriesChanges(['requestMessage'=>[ 
     'AuthenticationHeader'=>[ 
      'AppKey'=>'*', 
      'Password'=>'*', 
      'Username'=>'*', 
     ], 
     'UpdateCount'=>1000 
    ]]); 

И я ничего не получил. Я пробую то же самое с библиотекой мыла python, с soapui и ничего не получаю, тайм-аут. Хорошо, я смотрю его с помощью wirehark, и увидел, что мыльный клиент получает все схемы xsd и т. Д., А затем прерывание соединения после отправки запроса на URL: http://test2.unistream.com:82/wcflib-tc/service.svc, просто время ожидания. И я видел только простой http с xml, без пакетов с ssl. Хорошо, я пытаюсь отправить пост-запрос на этот адрес:

ini_set('default_socket_timeout', 30); 
$request_string = 
    '<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:ns1="http://schemas.datacontract.org/2004/07/WcfServiceLib" 
       xmlns:ns2="http://schemas.datacontract.org/2004/07/WcfServiceLib.Utils" 
       xmlns:ns3="http://schemas.datacontract.org/2004/07/WcfServiceLib.Dictionaries.Country" 
       xmlns:ns4="http://test.unistream.com/wcflib/"> 
    <env:Body> 
     <ns4:GetCountriesChanges> 
      <ns4:requestMessage> 
       <ns2:AuthenticationHeader> 
        <ns1:AppKey>*</ns1:AppKey> 
        <ns1:Password>*</ns1:Password> 
        <ns1:Username>*</ns1:Username> 
       </ns2:AuthenticationHeader> 
       <ns3:UpdateCount>1000</ns3:UpdateCount> 
      </ns4:requestMessage> 
     </ns4:GetCountriesChanges> 
    </env:Body> 
</env:Envelope> 
'; 

$url = 'http://test2.unistream.com:82/wcflib-tc/service.svc'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/soap+xml;', 'Charset=utf-8']); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_CAPATH, "/path"); 
//my cert 
curl_setopt($ch, CURLOPT_SSLCERT, "/path/local_cert.pem"); 
//my private key 
curl_setopt($ch, CURLOPT_SSLKEY, "/path/local_key.pem"); 
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, 'passwd'); 
//api's cert 
curl_setopt($ch, CURLOPT_CAINFO, '/path/api_cert.cer'); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_string); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_CERTINFO, true); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
print_r($result); 
echo "\n"; 
$error = curl_error($ch); 
print_r($error); 
echo "\n"; 

И я получаю XML с ошибкой: «Произошла ошибка при проверке безопасности для сообщения.» Если я пытаюсь отправить запрос на URL: https://test2.unistream.com:82/wcflib-tc/service.svc я получил простой HTML с ошибкой 400 и локоном ошибкой: «Ошибка: 140770FC: SSL процедура: SSL23_GET_SERVER_HELLO: неизвестный протокол»

поддержка не может помочь мне. Они сказали: «У нас 10000 работающих клиентов, мы консультируемся только о проблемах высокого уровня api и бизнес-логике».

Может ли кто-нибудь дать мне правильное направление?

ответ

0

У меня нет документов для unistream.

Я действительно знаю, что сертификаты являются транспортным уровнем. Это означает, что они происходят раньше всего. Но вы подключаетесь к URL-адресу HTTP, а не к URL-адресу HTTPS, а это значит, что вы не используете шифрование.

Сертификаты и шифрование не являются вашей проблемой.

Однако URL-адрес, который вы вставили, просто не прослушивает подключения к этому порту.

$ curl -v http://test2.unistream.com:82/wcflib-tc/service.svc?wsdl * Trying 94.127.155.67... * Connection timed out after 60001 milliseconds * Closing connection 0 curl: (28) Connection timed out after 60001 milliseconds

Вы не используете правильный адрес/номер порта вообще.

Следующая

  1. Получить правильный URL-адрес конечной точки
  2. не заморачиваться с сертификатом клиента, если конечная точка не используется HTTPS
Смежные вопросы