Я пытаюсь настроить клиент Soap со следующим кодом:
<?php
$wsdl = 'https://domain.com/?wsdl';
$endpoint = 'https://domain.com';
$certificate = dirname(__FILE__) . '/CertWithKey.pem';
$password = 'pwd';
$options = array(
'location' => $endpoint,
'keep_alive' => true,
'trace' => true,
'local_cert' => $certificate,
'passphrase' => $password,
'cache_wsdl' => WSDL_CACHE_NONE
);
try {
$soapClient = new SoapClient($wsdl, $options);
} catch(Exception $e) {
var_dump($e);
}
Мне дали файл ключа .p12 с файлом сертификации .crt. Используя openssl, я преобразовал .p12-файл в .pem-файл, а затем слил его с .crt-файлом. CertWithKey.pem выглядит хорошо для меня, два файла сертификата находятся в файле.
Независимо от того, что я пытаюсь сделать, я получаю исключение с сообщением SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl"
,
После разговора с удаленной стороной они подтверждают, что поступает запрос, но регистрируют эту ошибку: ssl handshake interrupted by system [hint: stop button pressed in browser?!]
,
Поскольку я не нашел никакой полезной информации в сети, я решил попросить вас, ребята, кое-что понять по этому вопросу.
Любые предложения, что можно попробовать? Я использую PHP 5.3.8, а IP-адрес сервера отображается в списке в брандмауэре удаленной стороны.
Я исправил эту проблему. Я думаю, что из-за количества вопросов, касающихся этой проблемы и количества различных решений, другие получат пользу от решения. Вот оно:
Я использовал openssl
Программа CLI для преобразования файла ключей .p12 в файл ключей .pem. Хитрость в том, как происходит преобразование.
Сначала я преобразовал это с этой командой, и у меня была проблема, как описано в вопросе:
openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts
В то время как команда ниже сделала настоящий трюк:
openssl pkcs12 -in key.p12 -out key.pem -clcerts
Для получения дополнительной информации см. Источник, который я использовал: https://community.qualys.com/docs/DOC-3273
Те же предложения:
Я использую SoapClient для соединения со службами SSL, и все работает нормально без указания URL-адреса «конечной точки». Тогда я рекомендую вам попробовать без этой опции;
У php SoapClient есть опция с именем «ssl_method», где вы можете изменить некоторые варианты этого протокола. Попробуйте изменить / указать этот параметр, если вы знаете, какой протокол используется;
Укажите «verifypeer => false» и «verifyhost => false» в списке параметров;