3

当使用 php:s SoapClient 向 https 肥皂服务器发出肥皂请求时,SoapFault 失败:

故障字符串:无法连接到主机
故障代码:HTTP

我必须确保soap服务器ssl证书有效,所以我正在使用

 <?php
 $soap=new SoapClient("mwsdl.wsdl"
           ,array(
                  "location"=>"https:examplesoapserver.com"
                  ,"trace"=>1
                  ,"stream_context"=>stream_context_create(array(
                         "ssl"=>array(
                                      "verify_peer"=>true
                                      ,"allow_self_signed"=>false
                                      )
                              )
                           )
                        )
                     );

但这给了我SoapFault。

我用不同的设置进行了测试:

好的
位置:有自签名证书
verify_peer=>真
allow_self_signed=>true
好的(不设置 verify_peer)
位置:有自签名证书
allow_self_signed=>false
不好
位置:有自签名证书
verify_peer=>真
allow_self_signed=>false
好的(不设置 verify_peer)
位置:ca签名证书
allow_self_signed=>false
不好
位置:ca签名证书
verify_peer=>真
allow_self_signed=>false

我有:

php版本:5.3.3
CentOS 6.4
阿帕奇/2.2.15

询问更多细节是否有助于找出问题。

预先感谢您的任何帮助!

4

1 回答 1

8

问题是 php 默认情况下具有不安全的设置来处理 https 请求。它不会验证证书或检查证书中的域是否正确。

您也必须自己下载用于验证证书的文件。

您可以在以下网址下载一个:http ://curl.haxx.se/ca/cacert.pem

正确处理它们的设置是

<?php
$client = new SoapClient("my-wsdlfile.wsdl"
                ,array(
                       "location"=>"https://examplesoapserver.com"
                       ,"stream_context"=>stream_context_create(
                          array(
                            "ssl"=>array(
                                "verify_peer"=>true
                                ,"allow_self_signed"=>false
                                ,"cafile"=>"path/to/cacert.pem"
                                ,"verify_depth"=>5
                                ,"CN_match"=>"examplesoapserver.com"
                                )
                            )
                        )
                    )
                );

其他可以使用 https ( like file_get_contents) 的 php 函数也存在同样的问题,因此确保其安全的相同解决方案应该可以工作。

CURL 默认具有安全设置,因此如果可能,它更易于使用。

这是关于 php 如何处理 https 的更详细的解释:

http://phpsecurity.readthedocs.org/en/latest/Transport-Layer-Security-(HTTPS-SSL-and-TLS).html#php-streams

于 2013-08-28T05:36:47.613 回答