我尝试使用以下代码设置Soap客户端:
<?php
$wsdl = 'https://domain.com/?wsdl';
$endpoint = 'https://domain.com';
$certificate = dirname(__FILE__) . '/CertWithKey.pem';
$password = 'pwd';
$options = array(
'location' => $endpoint,
'keep_alive' => true,
'trace' => true,
'local_cert' => $certificate,
'passphrase' => $password,
'cache_wsdl' => WSDL_CACHE_NONE
);
try {
$soapClient = new SoapClient($wsdl, $options);
} catch(Exception $e) {
var_dump($e);
}
我获得了一个带有.crt认证文件的.p12密钥文件。使用openssl我已将.p12文件转换为.pem文件,然后将其与.crt文件合并。 CertWithKey.pem看起来不错,文件中有两个证书块。
无论我尝试做什么,我都会收到消息SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl"
的异常。
在与远程方打电话后,他们确认请求即将进入,但他们正在记录此错误:ssl handshake interrupted by system [hint: stop button pressed in browser?!]
。
由于到目前为止我还没有在网上找到任何有用的信息,我想请你们就这件事情提出一些见解。
有什么建议可以尝试吗?我正在运行PHP 5.3.8,并且服务器的IP地址在远程控制台的防火墙中列为白色。
答案 0 :(得分:5)
我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从该解决方案中受益。这是:
我使用openssl
CLI程序将.p12密钥文件转换为.pem密钥文件。诀窍是转换的方式。
首先我用这个命令转换它,我遇到了问题中描述的问题:
openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts
虽然下面的命令做了实际的伎俩:
openssl pkcs12 -in key.p12 -out key.pem -clcerts
有关详细信息,请参阅我使用的来源:https://community.qualys.com/docs/DOC-3273
答案 1 :(得分:-1)
相同的建议:
我使用SoapClient连接SSL服务,一切正常,没有指定&#34;端点&#34; URL。然后我建议您尝试不使用此选项;
php SoapClient有一个名为&#34; ssl_method&#34;的选项。你可以在哪里改变这个协议的一些变化。如果您知道使用了什么协议,请尝试更改/指定此参数;
指定&#34; verifypeer =&gt;假&#34;和&#34; verifyhost =&gt;假&#34;在params列表;