【问题标题】:PHP SOAP client with certificates over SSL带有 SSL 证书的 PHP SOAP 客户端
【发布时间】:2014-11-21 13:34:10
【问题描述】:

我正在尝试使用以下代码设置 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 地址在远程方的防火墙中被列入白名单。

【问题讨论】:

    标签: php ssl soap wsdl ssl-certificate


    【解决方案1】:

    我已经解决了这个问题。我认为,由于有关此问题的问题数量和不同解决方案的数量,其他人将从解决方案中受益。如下:

    我使用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

    【讨论】:

    • 我也在尝试向服务器发送 SOAP 请求。我面临着一个类似的问题,我无法通过我的 php 应用程序与服务器通信。但通过 SOAP GUI 工作。我有一个 .p12 文件,我尝试通过转换为 .pem 文件来使用它。创建 SOAP 客户端对象时,出现错误:SOAP-ERROR: Parsing WSDL: Couldn't load from https://?wsdl : failed to load external entity https://?wsdl Can请告诉我这里出了什么问题?
    • 如果您按照我的回答并且成功合并了密钥和 crt 文件,则远程主机可能启用了防火墙并阻止了您的 IP 地址。否则我还不能说,也许你应该提出一个问题。
    • 我遇到了同样的问题。我遵循了@Ben 提供的确切步骤。必须使用提供的链接将 p12 转换为 .pem。但我仍然收到错误:curl: (58) Unable to load client cert -8018 奇怪的是,我认为我提供的密码是 3 位数'123',而不是我必须提供一些 6 个字母字符的有效密码。所以我相信,应该有一个很好的长度密码(不知道最小长度)。接下来缺少的是应该在 SoapClient 对象初始化中提供的“local_cert”、“密码”选项。
    【解决方案2】:

    同样的建议:

    1. 我使用 SoapClient 连接 SSL 服务,并且在没有指定“端点”URL 的情况下一切正常。那我建议你不使用这个选项试试;

    2. php SoapClient 有一个名为“ssl_method”的选项,您可以在其中更改此协议的某些变体。如果您知道使用什么协议,请尝试更改/指定此参数;

    3. 在参数列表中指定“verifypeer => false”和“verifyhost => false”;

    【讨论】:

    • 感谢您的回复。 1: 没有端点我也试过了;没有运气。 2: 由于我的 PHP 版本,我无法使用 ssl_method。 3: 我错了还是 verifypeer 和 verifyhost 未记录的参数(或者至少它们不在文档中:php.net/manual/en/soapclient.soapclient.php)。提供它们也没有区别。
    • Specify "verifypeer =&gt; false" and "verifyhost =&gt; false" on params list; 这意味着禁用安全性。总是一个坏主意
    • 如果你查看 php 的 soap 扩展的 c 源代码,你会发现 verifyhost 和 verifypeer 都不支持,所以这里的建议 #3 应该被忽略。
    猜你喜欢
    • 2012-01-10
    • 2022-08-22
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多