Intereting Posts
Что заменить mysql_result для MySQLi Исключить папки из рекурсии в рекурсивном каталоге iterator php pdo – вызов функции-члена prepare () для не-объекта Настройка Solr с использованием Java для модифицированного вывода? Как добавить параметр в URL? Walmart API продавца POST не работает, Дает 401 несанкционированных только на PHP Howto Reverse-Engineer REST-Webservice Динамическое изменение позиции корзины не работает с заказами в WooCommerce 3.0+ Android с php: сохранение строки utf-8 в MySQL in_array несколько значений Добавление программно более загружаемых файлов для продуктов в WooCommerce Карты Google – панорамирование и масштабирование по областям – маркеры не появляются при увеличении или панорамировании – ПОМОЩЬ! Как проверить, что объект пуст в PHP? Замена формы HTML с сообщением об успешности после отправки, форма отправляет почту с использованием отдельного php-файла Как запустить загрузку с помощью typo3 / extbase?

Как заставить PHP SOAP-клиент взаимодействовать с сервисом, работающим через SSL, с недопустимым сертификатом

Я пытаюсь использовать SOAP-сервис с помощью PHP SOAP-клиента, но он не работает с сообщением:

SoapFault: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/webservice.asmx?wsdl' : failed to load external entity "https://domain.com/webservice.asmx?wsdl"\n in /Users/andrewdchancox/Projects/test/testsoap.php on line 10 

Я загрузил файл wsdl и служил ему из локального экземпляра apache и загружал его без каких-либо проблем. Единственное, что я могу подумать, это то, что веб-служба работает через SSL с самоподписанным сертификатом – когда я wget wsdl получаю следующую ошибку:

 --2012-09-11 16:28:39-- https://domain.com/webservice.asmx?wsdl Resolving domain.com (domain.com)... 11.111.111.11 Connecting to domain.com (domain.com)|11.111.111.11|:443... connected. ERROR: The certificate of 'domain.com' is not trusted. ERROR: The certificate of 'domain.com' hasn't got a known issuer. 

Я googled вокруг и тщательно прочитал документы PHP для клиента PHP SOAP – http://php.net/manual/en/class.soapclient.php и его конструктор – http://www.php.net/manual/ en / soapclient.soapclient.php и не нашел ничего, чтобы помочь.

У кого-нибудь есть идеи?

Это было два года назад, но я думаю, что он заслуживает ответа.

Класс SoapClient в PHP использует потоки PHP для связи через HTTP. По разным причинам SSL через потоки PHP небезопасны 1 , но в этом случае ваша проблема в том, что она слишком безопасна.

Первым шагом к решению является использование параметра stream_context при создании вашего SoapClient 2 . Это позволит вам указать более сложные настройки SSL 3 :

 // Taken from note 1 below. $contextOptions = array( 'ssl' => array( 'verify_peer' => true, 'cafile' => '/etc/ssl/certs/ca-certificates.crt', 'verify_depth' => 5, 'CN_match' => 'api.twitter.com', 'disable_compression' => true, 'SNI_enabled' => true, 'ciphers' => 'ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4' ) ); $sslContext = stream_context_create($contextOptions); // Then use this context when creating your SoapClient. $soap = new SoapClient('https://domain.com/webservice.asmx?wsdl', array('stream_context' => $sslContext)); 

Идеальное решение вашей проблемы – создать свой собственный сертификат ЦС, использовать его для подписания сертификата SSL и добавить сертификат CA в cafile . Еще лучше, может быть, иметь только этот сертификат в cafile , чтобы избежать cafile , чтобы какой-либо изгоев CA подписывал чужой сертификат для вашего домена, но это не всегда будет практичным.

Если то, что вы делаете, не обязательно должно быть безопасным (например, во время тестирования), вы также можете использовать настройки SSL в контексте потока, чтобы снизить безопасность вашего соединения. Опция allow_self_signed позволит самоподписанные сертификаты:

 $contextOptions = array( 'ssl' => array( 'allow_self_signed' => true, ) ); $sslContext = stream_context_create($contextOptions); $soap = new SoapClient('https://domain.com/webservice.asmx?wsdl', array('stream_context' => $sslContext)); 

Ссылки:

  1. Survive the Deep End: безопасность PHP – безопасность транспортного уровня (HTTPS, SSL и TLS) – потоки PHP
  2. PHP: SoapClient :: SoapClient
  3. PHP: параметры контекста SSL