【问题标题】:Php SoapClient verify_peer=>true fails with ca-signed certificatePhp SoapClient verify_peer=>true 使用 ca 签名证书失败
【发布时间】:2013-08-30 05:00:00
【问题描述】:

当使用 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
OK(不设置 verify_peer)
位置:有自签名证书
allow_self_signed=>false
不行
位置:有自签名证书
verify_peer=>真
allow_self_signed=>false
OK(不设置 verify_peer)
位置:ca签名证书
allow_self_signed=>false
不行
位置:ca签名证书
verify_peer=>真
allow_self_signed=>false

我有:

php 版本:5.3.3
CentOS 6.4
Apache/2.2.15

询问更多细节是否有助于解决问题。

提前感谢您的帮助!

【问题讨论】:

    标签: php ssl soap-client soapfault


    【解决方案1】:

    问题是 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 的 php 函数(例如 file_get_contents )也存在同样的问题,因此确保其安全的相同解决方案应该可以工作。

    默认情况下,CURL 具有安全设置,因此如果可能,使用它会更容易。

    这里有一个关于php如何处理https的更详细的解释:

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

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2019-11-26
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多