TLDR:我正在尝试使用自签名客户端证书执行SOAP请求,但它失败,但“无法连接到主机”。
全文:
1)我使用openssl用这样的命令创建.pem
证书:
openssl req -new -x509 -days 30 -keyout server.key -out server.pem
然后我在我的本地apache上启用了HTTPS,并将其配置为将其用作SSLCertificateFile
。
2)然后我创建了简短的PHP脚本来捕获SOAP请求。它只记录它可以的所有内容并返回“OK”。不是一个好的SOAP响应,但此刻不要打扰它。在我的浏览器中用https://localhost/soap/
检查它,它显示“错误的证书”警告(如预期的那样),然后我看到“OK”捕手响应。
3)现在是时候将SOAP请求发送到捕获器脚本了。我正在使用以下代码(本地WSDL副本和SOAP服务地址称为https://localhost/soap/
):
$stream_context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
),
));
$soap_params = array(
'local_cert' => 'path/to/certificate',
'trace' => true,
'stream_context' => $stream_context,
);
$soap = new SoapClient(
'path/to/wsdl',
$soap_params
);
$result = $soap->__soapCall('methodName', array());
在最后一行出现异常:“无法连接到主机”。
我甚至可以删除流上下文,并且会产生相同的结果,所以我认为它不会影响故事。我还尝试了'https'上下文,同时尝试了'ssl'和'https'。如果我删除local_cert
参数,我会看到另一条消息:“看起来我们没有XML文档”,可以解释为收到“OK”消息。
我正在运行PHP 5.3.29。
所以,问题是:
1)在我的PHP版本下,'ssl'流上下文是没有意义的,或者我只是错误地使用它?
2)是否有其他方法可以强制SOAP使用此证书? (这是客户要求所以我不能省略它。)
UPD : PHP文档说明
local_cert string
文件系统上本地证书文件的路径。它必须是 PEM编码文件,其中包含证书和私钥。它可以选择包含颁发者的证书链。
所以我通过连接.pem
和.crt
文件重新生成.key
,使用它并帮助了它。我也跳过使用$stream_context
。
UPD2 :上述问题仍然存在。