Php SoapClient verify_peer = ›true не работает с сертификатом, подписанным CA

При выполнении запроса мыла к серверу мыла https с использованием php: s SoapClient завершается с ошибкой SoapFault:

faultstring: Could not connect to host
faultcode: HTTP

Я должен быть уверен, что 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.

Я тестировал с разными настройками:

OK
location: has self-signed certificate
verify_peer=>true
allow_self_signed=>true
OK (without setting verify_peer)
location: has self-signed certificate
allow_self_signed=>false
NOT OK
location: has self-signed certificate
verify_peer=>true
allow_self_signed=>false
OK (without setting verify_peer)
location: ca-signed certificate
allow_self_signed=>false
NOT OK
location: ca-signed certificate
verify_peer=>true
allow_self_signed=>false

У меня есть:

php version: 5.3.3
CentOS 6.4
Apache/2.2.15

Спросите более подробную информацию, если это поможет выяснить проблему.

Спасибо заранее за любую помощь!


person Macke    schedule 27.08.2013    source источник


Ответы (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"
                                )
                            )
                        )
                    )
                );

Та же проблема существует с другими функциями php, которые могут использовать https (например, file_get_contents), поэтому должно работать то же решение для обеспечения безопасности.

CURL имеет безопасные настройки по умолчанию, поэтому, если возможно, его проще использовать.

Вот отличное и более подробное объяснение того, как php обрабатывает https:

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

person Macke    schedule 28.08.2013