Отключить проверку сертификата в PHP SoapClient - PullRequest
56 голосов
/ 09 декабря 2011

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

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

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

Ответы [ 3 ]

93 голосов
/ 09 декабря 2011

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
]);

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

12 голосов
/ 24 июня 2015

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

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

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

3 голосов
/ 11 мая 2015

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

'ssl' => array('verify_peer_name'=>false, 'allow_self_signed' => true),
...