PHP SoapClient不会使用客户端证书检索WSDL

问题描述 投票:1回答:2

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

我必须从我的Web服务器调用另一个外部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错误:解析WSDL:无法从'..domain ..'加载:无法加载外部实体“ ..domain ..?wsdl”

我尝试了许多设置,但这些设置都没有改变此响应。我未尝试任何设置,为空数组。

有效的方法:

  • 通过CURL建立原始连接,因此证书文件很好

  • 从SoapUI检索WSDL信息,因此WSDL目标是正确的,并且证书文件是可以的

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

php web-services soap wsdl soap-client
2个回答
0
投票

SOAP错误可能来自无效的字符编码,或者当您查询远程服务器时,可能缺少一些HTTP标头,例如'User-Agent。

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

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

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


0
投票

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

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

如果以上方法均无帮助。您可能会考虑使用其他工具(例如cURL)并在其他计算机上下载WSDL内容,以确定问题的原因。

© www.soinside.com 2019 - 2024. All rights reserved.