【发布时间】:2011-01-18 08:11:56
【问题描述】:
我已经制作了几个使用外部 WSDL 的脚本。我遇到了一个我必须集成到我们的系统中但无法开始工作的问题。我已经尝试了一周没有任何结果。
脚本在创建构造函数时已经失败:
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL");
给出错误:
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL' : failed to load external entity "https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL"
我确实安装了 openssl 并使用 PHP,并且记住我已经通过 SSL 对其他 WSDL 进行了其他有效的 SOAP 调用。我发现我也无法用证书解决这个问题,因为它已经在构造函数中失败了。
但是: 我尝试用openssl命令行连接远程服务器,这个命令也失败了:
openssl s_client -connect webtjener09.kred.no:443 -state
但后来我尝试将其强制为 SSL3,并且效果很好,如下所示:
openssl s_client -ssl3 -connect webtjener09.kred.no:443 -state
这让我想到我必须匹配远程服务器的 SSL 版本。为了仔细检查,我还尝试通过 PHP 建立 cURL 连接,但它失败了,直到我添加了这样的 SSL 版本的强制:
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
将 CURLOPT_SSLVERSION 添加到 cURL 连接就可以了。然后是我的问题的根源:
如何强制 PHP soap 构造函数/调用也使用 SSL3。在我看来,这必须是解决方案。但我还没有找到如何将 PHP SOAP 函数设置为仅使用 SSL3。由于命令行 -openssl- 和 PHP cURL 都强制使用 SSL3,所以我认为我的 SOAP 函数也会发生同样的事情?
请输入?
(使用 Ubuntu Linux,PHP 5.3.3)
【问题讨论】:
-
从 PHP 5.5.0 开始可以为 SoapClient 设置 SSL_METHOD,但如果尝试获取 WSDL 文件时出现问题,则必须通过 cURL 手动下载。