У меня проблема с взаимодействием с сервисом 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 и бизнес-логике».
Может ли кто-нибудь дать мне правильное направление?