Отключить проверку сертификата в PHP SoapClient

Резюме:
Есть ли способ заставить встроенный SoapClient-класс в PHP подключаться через HTTPS к серверу с недействительным сертификатом?

Зачем мне это нужно?
Я развернул новое приложение на сервере, на котором еще нет записи DNS или сертификата. Я хочу попробовать подключиться к нему с помощью SoapClient перед настройкой записи DNS и исправлением сертификата, и наиболее разумный способ сделать это, по-видимому, - просто заставить клиент игнорировать сертификат во время тестирования.

Разве я не понимаю, что это серьезная угроза безопасности?
Это только для тестирования. Когда сервис будет запущен в производство, на месте будет действующий сертификат, и клиент будет вынужден его проверить.


person MW.    schedule 09.12.2011    source источник
comment
Мне также интересно, сработало ли предложенное решение   -  person Gabriel Croitoru    schedule 21.12.2011


Ответы (4)


SoapClient принимает контекст потока в своих параметрах, которые вы можете создать самостоятельно. Таким образом, вы можете контролировать практически все аспекты транспортного уровня:

$context = stream_context_create([
    'ssl' => [
        // set some SSL/TLS specific options
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$client  = new SoapClient(null, [
    'location' => 'https://...',
    'uri' => '...', 
    'stream_context' => $context
]);

Документация:

person Kaii    schedule 09.12.2011
comment
К сожалению, это не работает, и для параметра verify_peer уже установлено значение false (php.net /manual/en/context.ssl.php). - person zpon; 29.02.2012
comment
@zpon: Обычно это работает. Оформить заказ, вы не используете другой подслой SSL, который имеет другие параметры. Также дважды проверьте, не столкнулись ли вы с ошибкой PHP, см. Связанный вопрос: параметр Php SoapClient stream_context - person hakre; 02.01.2013
comment
А как насчет allow_self_signed, установленного на true? Также по умолчанию false - person Michel Feldheim; 06.01.2013
comment
Вышеупомянутое решение не работает на php версии 5.6.31. Я использую тестовый скрипт на том же сервере, где установлен magento. Я получаю следующую ошибку: Неустранимая ошибка: исключение Uncaught SoapFault: [VersionMismatch] Неверная версия. - person George Donev; 22.09.2017

Принятый ответ работает, но только в режиме без WSDL. Если вы попытаетесь использовать это в режиме WSDL (т. Е. Вы передадите URL-адрес файла WSDL в качестве первого аргумента), вы столкнетесь с тем, что контекст потока игнорируется при загрузке файлов WSDL. Таким образом, если файл WSDL также находится на сервере со сломанным сертификатом, он завершится ошибкой, скорее всего, с выдачей сообщения failed to load external entity. Дополнительные сведения см. здесь и здесь.

Как было предложено, самый простой способ - загрузить файл WSDL вручную и передать локальную копию в SoapClient. Вы можете загрузить его, например, с помощью file_get_contents, используя тот же контекст потока из принятого ответа.

Обратите внимание, что вам также придется сделать это при создании SoapServer.

person tobik    schedule 24.06.2015
comment
Я пробовал принятый ответ в PHP7, и он работал в режиме WSDL. Так что, возможно, проблема была решена сейчас. - person Michael Härtl; 25.07.2016

Правильный список для PHP 5.6.8:

'ssl' => array('verify_peer_name'=>false, 'allow_self_signed' => true),
person Will T    schedule 11.05.2015

"verify_peer"=>false,
"verify_peer_name"=>false,

Это работает на php 5.6.x;

$arrContextOptions=stream_context_create(array(
            "ssl" => array(
                 "verify_peer" => false,
                 "verify_peer_name" => false,
            )));
$this->client = new \SoapClient("https://tests.com?WSDL",
              array(
                //"soap_version" => SOAP_1_2,
                "trace"      => 1,      // enable trace to view what is happening
                "exceptions" => 0,      // disable exceptions
                "cache_wsdl" => 0,      // disable any caching on the wsdl, encase you alter the wsdl
                "stream_context" => $arrContextOptions
              ) 
                    
            );

или, если хотите, можете добавить в метод cyrpto

$arrContextOptions=stream_context_create(array(
            "ssl"=>array(
                 "verify_peer"=>false,
                 "verify_peer_name"=>false,
                 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
            ));
            
person Ferhat KOÇER    schedule 15.06.2020