带有客户端证书的PHP SOAP失败

时间:2016-12-15 20:24:37

标签: php ssl soap

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 :上述问题仍然存在。

0 个答案:

没有答案