【问题标题】:PHP SoapClient Doesn't Retrieve WSDL with Client CertificatePHP SoapClient 不使用客户端证书检索 WSDL
【发布时间】:2020-03-06 15:47:40
【问题描述】:

其他类似的问题并没有帮助我解决这个问题。

我必须使用客户端证书 + 私钥组合从我的网络服务器调用另一个外部 SOAP API 来检索 WSDL 文件。

$wsdl     = 'https://www.example.com?wsdl';
$endpoint = 'https://www.example.com';

$sslContext = stream_context_create($contextOptions);

$options = [
    'local_cert'                => '/var/www/combo.pem',
    'passphrase'                => 'Pass1',
    'cache_wsdl'                => WSDL_CACHE_MEMORY,
    'trace'                     => 1,
    'stream_context'            => stream_context_create([
        'ssl' => [
            'ciphers'           => 'RC4-SHA',
            'verify_peer'       => false,
            'verify_peer_name'  => false,
            'allow_self_signed' => true
        ]
    ])
];

try{
    $soapClient = new SoapClient($wsdl, $options);
}
catch(Exception $e)
{
    var_dump($e);
}

我得到的错误是: SOAP-ERROR: Parsing WSDL: Couldn't load from '..domain..' : failed to load external entity "..domain..?wsdl"

我尝试了许多设置,但没有一个对这个响应有任何影响。我没试过设置,空数组。

什么有效:

  • 通过 CURL 建立原始连接,所以证书文件没问题

  • 从 SoapUI 检索 WSDL 信息,因此 WSDL 目标正确且证书文件正常

phpinfo() 返回 SoapClient 已启用,OpenSSL 已启用。我还能尝试或检查什么?

【问题讨论】:

  • 您可以尝试通过简单的file_get_contents 加载 WSDL 以确保可以加载它
  • @NicoHaase 1) 我通过 SoapUI 加载了文件。它可以加载。 2) 我不确定 file_get_contents 是否可以使用客户端证书文件
  • file_get_contents 可以使用与您在脚本中创建的相同的$context。确保可以加载 WSDL,以确保问题以任何方式连接到 SOAP 而不是网络/证书问题
  • @NicoHaase 无法使用 file_get_contents 完成此操作,该值始终为 false。我设法通过从 SoapUI 下载 wsdl 文件来加载它。我仍然无法连接以提出请求。
  • 好吧,如果请求失败,file_get_contents 会产生 false。这意味着:即使失败了,您在连接到该服务器时也会遇到严重问题。另一方面,这意味着您不一定会遇到与 SOAP 相关的问题

标签: php web-services soap wsdl soap-client


【解决方案1】:

当您查询远程服务器时,SOAP 错误可能来自无效的字符编码或某些 HTTP 标头丢失,例如“User-Agent”。

尝试将 User-Agent 添加到以下示例中的选项。

$options = array(
    'http' => array(
        'user_agent' => 'PHP_Embedded_Soap_Client'
    )
);

PS:我不建议使用严格的密码:RC4-SHA

【讨论】:

    【解决方案2】:

    我想对此发表评论,但基于其他人使用 file_get_contents 的建议以及您提到它返回 false 的回复,我现在有点确定这更像是一个连接问题。请检查以下内容:

    1. 很明显,您的实际$wsdl 值与发布的不同,但请确保.com?wsdl 没有出现在您的代码中。应该是.com/?wsdl
    2. 检查您的 DNS 设置。通过 dnslookup 进行查找有助于发现问题。
    3. 确保服务器的日期和时间设置正确。它可能导致 SSL 错误。

    如果以上都没有帮助。您可以考虑使用其他工具(例如cURL)在不同的机器上下载 WSDL 内容以确定问题的原因。

    【讨论】:

    • 在 SoapClient 中加载 WSDL 文件有效。但我就是无法连接,就是这样,是的。
    • @IvanIvković 我记得我在使用 3rd 方 API 时遇到过类似的问题。他们没有使用 SSL,一旦切换到 SSL,我就无法再连接,尽管可以访问 WSDL。经过数小时的头痛后,事实证明问题出在他们身边。 WSDL 中soap:address 标记的location 属性仍然指的是http 而不是httpS。所以请手动下载 WSDL 并查找soap:address location="https......" />。确保它是httpS。如果还没有解决问题,请使用 httpS 保存修改后的副本并从文件加载 wsdl。
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多