【问题标题】:Does PHP SoapClient support HTTPS connectionsPHP SoapClient 是否支持 HTTPS 连接
【发布时间】:2015-03-22 11:14:43
【问题描述】:

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

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

我收到以下错误:

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR:解析 WSDL:无法从“https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl”加载:无法在 C:\xampp\htdocs\dev 中加载外部实体“https://smi.sp.f-secure.com/smi/5.1/services/EchoService?wsdl” \w3schools\soapClient\index.php:2 堆栈跟踪:
#0 C:\xampp\htdocs\dev\w3schools\soapClient\index.php(2): SoapClient->SoapClient('https://smi.sp....')
#1 {main} 在第 2 行的 C:\xampp\htdocs\dev\w3schools\soapClient\index.php 中抛出

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

TLSv1 记录层:警报(级别:致命,描述:证书未知)

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

所以肯定是 SOAP 扩展和 SSL 通信。任何人都可以帮忙吗?提示寻找什么?

【问题讨论】:

  • 我不希望 SOAP 对付我最大的敌人。
  • 谢谢 Len_D。我的 extension=php_openssl.dll 已启用,OpenSSL 版本为 1.0.1i。它必须与 PHP SOAP 相关,因为当我使用 nuSOAP 时,它能够使用相同的 HTTPS 服务。
  • PHP 上的同样问题 >= 7

标签: php soap https


【解决方案1】:

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 站点下载并正常处理。

【讨论】:

    【解决方案2】:

    这与 php 5.6 中的这种变化有关:http://php.net/manual/en/migration56.openssl.php

    我在使用 php 5.6 的 Windows 上遇到了同样的问题,但在使用 php 5.6 的 Linux 上也可以正常工作。

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

    到目前为止,我无法找到解决方案。

    【讨论】:

    • 在LINux环境下工作确实解决了问题
    • 在 Linux 环境中工作并不能解决我的问题。
    【解决方案3】:

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

    补充: 当试图捕获 SOAP 异常时,它会失败。 我希望在这个版本中,关于 SOAP 客户端未考虑套接字超时的古老 https 错误已得到修复,但 SOAP 客户端的问题似乎仍在持续。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 2019-08-04
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多