МЫЛО с двумя файлами сертификатов и "Не удалось подключиться к хосту"
У меня проблема с подключением PHP к API, который требует использования SSL-сертификатов. Проблема в том, что когда я запускаю свой PHP-код, я получаю "Не удалось подключиться к хосту".
Я смог подключиться к поставщику услуг с помощью CURL следующим образом:
$wsdl = 'https://example.com/Case.svc';
$certFile = getcwd() . '/certificate.crt';
$keyFile = getcwd() . '/key.pem';
$password = 'password';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
Однако я не смог сделать это с помощью SOAP:
$options=array(
'soap_version' => SOAP_1_2,
'trace' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'exceptions' => 1,
'encoding' => 'UTF-8',
'stream_context'=>stream_context_create(
array(
'ssl'=>array(
'verify_peer'=>true
,'allow_self_signed'=>false
,'cafile'=>'certificate.crt'
,'verify_depth'=>5
)
)
),
'local_cert' => 'key.pem',
'passphrase' => 'password',
);
$client = new SoapClient("Case.wsdl", $options);
Это приводит к "Не удалось подключиться к хосту".
Проблема может быть в самом сертификате, возможно, мне нужно объединить два сертификата в один файл. Я вижу, что у многих людей была одна и та же проблема, большинство из них не получили ответа.
Почему код SOAP возвращает "Не удалось подключиться к хосту" и как это исправить?
2 answers
Некоторые места для начала:
1) Что такое certificate.crt? Это сертификат клиента или сертификат центра сертификации? Вы используете CURLOPT_SSLCERT (устанавливает сертификат клиента), но используете директиву файла cafile в SoapClient (устанавливает файл сертификата CA).
2) Вы используете CURLOPT_SSL_VERIFYPEER = false, но в другом фрагменте вы используете verify_peer.
Так что попробуйте еще немного отладить с этими изменениями, имея тот же тип среды.
Если ваш сертификат самозаверяющий, вам не нужно устанавливать cafile. cafile предназначен только для сети CA. local_cert должен иметь оба: сертификат (лист) и закрытый ключ, соединенные, например:
-----BEGIN CERTIFICATE-----
MIIDsDCCApgCAWUwDQ....
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsMGypi...
-----END RSA PRIVATE KEY-----
По какой-то причине самозаверяющий сертификат не работает для меня в ubuntu, но отлично работает в mac os.