我遇到了SOAP-client和curl与Unistream服务交互的问题。
我的环境:Ubuntu 15.04,php 5.64
一些历史:unistream的支持要求我们生成证书: makecert.exe -n“CN = some_name”-ss My -r -m 120 -pe -sky exchange -a sha1,然后通过mmc end send certificate导出到它们。好的,我们这样做并获得了他们身边的证书。 我将他们的证书转换为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 soap库,使用soapui并没有得到任何东西,超时。 好吧,我用wireshark查看它,并看到soap客户端收到所有xsd架构等,然后在发送请求后发送连接中断到url:http://test2.unistream.com:82/wcflib-tc/service.svc,只是超时。我只看到了带有xml的普通http,没有带有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我得到了错误400和curl错误的简单html:“错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议”
支持无法帮助我。他们说“我们有10000个工作客户,我们只咨询高级api问题和商务逻辑”。
有人可以给我正确的方向吗?
答案 0 :(得分:0)
我没有unistream的文档。
我知道证书是传输层。这意味着它们先于其他任何事物发生。但是,您要连接到HTTP网址,而不是HTTPS网址,这意味着您不会使用加密。
证书和加密不是您的问题。
但是,您粘贴的URL只是没有侦听该端口上的连接。
$ curl -v http://test2.unistream.com:82/wcflib-tc/service.svc?wsdl *尝试94.127.155.67 ...... *连接在60001毫秒后超时 *关闭连接0卷曲:(28)连接在60001毫秒后超时
您根本没有使用正确的地址/端口号。