Два запроса SoapClient для двух разных сторонних служб WSDL, один работает, другой нет

В обоих случаях соответствующий WSDL загружается в Firefox и показывает «Безопасное соединение». Версия PHP 5.6.22, это означает, что по умолчанию PHP будет проверять, что соединение безопасно (в отличие от поведения PHP 5.5.x и более ранних версий). http://php.net/manual/en/migration56.openssl.php). Идея состоит в том, чтобы точно выполнять безопасные соединения, оба случая сделаны для обеспечения безопасности, а соответствующие проверки выполняются неявно.


Нужно ли это дело для работы (Дело А):

$wsdl = 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient($wsdl);
$seed = $SoapClient -> getSeed();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($seed);

Ошибка:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL' : failed to load external entity "https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL"in /path/to/script.php:3
Stack trace:
#0 /path/to/script.php(3): SoapClient->SoapClient('https://palena....')
#1 {main}
thrown in /path/to/script.php on line 3

Этот пример дела работает (Случай B):

$wsdl = 'https://www.lb.lt/webservices/ExchangeRates/ExchangeRates.asmx?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient($wsdl);
$exchangeRate = $SoapClient -> getExchangeRate();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($exchangeRate);

Dump:

object(stdClass)#2 (1) { ["getExchangeRateResult"]=> string(2) "-1" }

Примечание: этот случай является вспомогательным, только для демонстрации.


Случай А работал месяцами (всегда PHP 5.6.x), только два дня назад он перестал работать и выдает ошибку, но код не был изменен. Дата отказа близка к Действителен с дата сертификата веб-службы (с 12 декабря 2016 года по 14 декабря 2017 года), похоже, что сервер только что обновил свой сертификат (увидел даты в деталях сертификата, загрузив адрес WSDL в браузере), очень вероятно, что это имеет отношение к проблеме.

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

wget http://symantec.tbs-certificats.com/Symantec_Class_3_EV_SSL_CA_G3.crt
cp Symantec_Class_3_EV_SSL_CA_G3.crt
/etc/pki/ca-trust/source/anchors update-ca-trust

В некоторой степени это, похоже, сработало, потому что теперь ошибка не выводится из строки 3 (SoapClient), но из строки 4 (getSeed):

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host
in /path/to/script.php:4
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://palena....', '', 1, 0)
#1 /path/to/script.php(4): SoapClient->__call('getSeed', Array)
#2 /path/to/script.php(4): SoapClient->getSeed()
#3 {main}
thrown in /path/to/script.php on line 4

Случай А работает при отключении проверки защищенного соединения (но это не решение, потому что это нарушает безопасность):

$wsdl = 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient(
$wsdl
, [
'stream_context' => stream_context_create([
'ssl' => [
'verify_peer' => false,
],
]),
]
);
$seed = $SoapClient -> getSeed();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($seed);

Dump:

string(219) "00436612495400"

Почему дело А не работает с проверкой безопасности и как это исправить?

0

Решение

Для меня случай B также работает:

Это повторяет это:

<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
<SII:RESP_BODY>
<SEMILLA>004361002032</SEMILLA></SII:RESP_BODY>
<SII:RESP_HDR><ESTADO>00</ESTADO></SII:RESP_HDR>
</SII:RESPUESTA>

Я использую PHP версии 5.5.9

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]