PHP SoapClient 是否支持 HTTPS 连接

Does PHP SoapClient support HTTPS connections

我在 Windows 上使用 XAMPP 并尝试使用 PHP soap 扩展 SoapClient。我正在尝试使用以下代码加载托管在 HTTPS 站点中的 WSDL 文件

<?php
    $myClient=new SoapClient("https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl");
?>

我收到以下错误:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl' : failed to load external entity "https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl" in C:\xampp\htdocs\dev\w3schools\soapClient\index.php:2 Stack trace:
#0 C:\xampp\htdocs\dev\w3schools\soapClient\index.php(2): SoapClient->SoapClient('https://smi.sp....')
#1 {main} thrown in C:\xampp\htdocs\dev\w3schools\soapClient\index.php on line 2

现在我在请求期间进行了网络捕获,发现 HTTPS 通信在 SSL 级别上无法正常工作。 Wireshark 在服务器密钥交换上显示一个数据包,我的工作站响应为:

TLSv1 Record Layer: Alert (Level: Fatal, Description: Certificate Unknown)

在同一台计算机上使用 nuSOAP 客户端或 soapUI 实用程序,我能够正常连接到该服务。所以我猜没有证书问题。

所以肯定是 SOAP 扩展和 SSL 通信。谁能帮忙?提示要查找的内容?

PHP Soap 扩展,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站点下载,正常处理。

它与 php 5.6 中的此更改有关:http://php.net/manual/en/migration56.openssl.php

我在 Windows 和 php 5.6 上遇到了同样的问题,它在 Linux 和 php 5.6 上工作正常。

您可以使用函数openssl_get_cert_locations查看证书位置。

到目前为止我找不到解决方案。

在 Windows 服务器上与 PHP 5.6.9 有同样的问题,以前使用 PHP 5.3.3 时没有这个问题。 检查了推荐的每个设置(正在加载扩展),你知道吗,后来我发现 运行 命令行上的脚本没有问题...

补充: 尝试捕获 SOAP 异常时失败。 我希望在这个版本中修复了关于 SOAP 客户端不考虑套接字超时的古老 https 错误,但 SOAP 客户端的问题似乎仍在继续。

要解决此错误,您可以停用 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,
        ],
    ]),
]);