我在Windows上使用XAMPP并尝试使用PHP soap扩展SoapClient。我尝试使用以下代码
加载HTTPS站点中托管的WSDL文件<?php
$myClient=new SoapClient("https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl");
?>
我收到以下错误:
致命错误:未捕获的SoapFault异常:[WSDL] SOAP-ERROR:解析WSDL:无法从&#39; https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl&#39;加载:未能加载外部实体&#34; https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl&#34;在C:\ xampp \ htdocs \ dev \ w3schools \ soapClient \ index.php:2堆栈跟踪:
#0 C:\ xampp \ htdocs \ dev \ w3schools \ soapClient \ index.php(2):SoapClient-&gt; SoapClient(&#39; https://smi.sp ....&#39;)
在第2行的C:\ xampp \ htdocs \ dev \ w3schools \ soapClient \ index.php中抛出#1 {main}
现在,我在请求期间进行了网络捕获,发现HTTPS通信在SSL级别上无效。 Wireshark在服务器密钥交换机上显示一个数据包,我的工作站响应:
TLSv1记录层:警报(级别:致命,描述:证书未知)
在同一台计算机上使用nuSOAP客户端或soapUI实用程序,我能够正常连接到该服务。所以我猜没有证书问题。
所以它肯定是SOAP扩展和SSL通信的东西。有人可以帮忙吗?给出提示要查找的内容?
答案 0 :(得分:3)
要解决此错误,您可以停用SSL证书验证。但请记住,这只应针对测试用例进行,因为此会使您的连接不安全!
您可以在实例化SoapClient
时传递流上下文:
<?php
$myClient = new SoapClient("https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl", [
'stream_context' => stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
]),
]);
如果您拥有有效的证书,但它是自签名的,则还有另一种解决方案(更安全):
<?php
$myClient = new SoapClient("https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl", [
'stream_context' => stream_context_create([
'ssl' => [
'allow_self_signed' => true,
],
]),
]);
答案 1 :(得分:0)
PHP Soap Extension,SoapClient支持HTTPS连接。
我的问题肯定是一个错误,我正在处理XAMPP 5.6.3(PHP 5.6.3,Apache 2.4.10)
当我部署XAMPP 5.5.19(PHP 5.5.19,Apache 2.4.10)时,我的代码工作正常。 WSDL文件从HTTPS站点下载并正常处理。
答案 2 :(得分:0)
它与php 5.6中的这一变化有关:http://php.net/manual/en/migration56.openssl.php
我在使用php 5.6的Windows上遇到了同样的问题,它在使用php 5.6的Linux上运行良好。
您可以使用功能openssl_get_cert_locations查看证书位置。
到目前为止,我无法找到解决方案。
答案 3 :(得分:0)
在以前使用PHP 5.3.3的Windows服务器上遇到与PHP 5.6.9相同的问题时没有问题。 检查建议的每个设置(加载扩展),你知道吗,之后我发现在命令行上运行脚本没有问题......
其他: 尝试捕获SOAP异常时,它会失败。 我希望在这个版本中修复了关于没有考虑套接字超时的SOAP客户端的老旧的https错误,但是SOAP客户端的问题似乎仍在继续。