МЫЛО с двумя файлами сертификатов и "Не удалось подключиться к хосту"


У меня проблема с подключением 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 возвращает "Не удалось подключиться к хосту" и как это исправить?

Author: jww, 2016-11-11

2 answers

Некоторые места для начала:

1) Что такое certificate.crt? Это сертификат клиента или сертификат центра сертификации? Вы используете CURLOPT_SSLCERT (устанавливает сертификат клиента), но используете директиву файла cafile в SoapClient (устанавливает файл сертификата CA).

2) Вы используете CURLOPT_SSL_VERIFYPEER = false, но в другом фрагменте вы используете verify_peer.

Так что попробуйте еще немного отладить с этими изменениями, имея тот же тип среды.

 0
Author: Iskar, 2016-11-11 16:25:03

Если ваш сертификат самозаверяющий, вам не нужно устанавливать cafile. cafile предназначен только для сети CA. local_cert должен иметь оба: сертификат (лист) и закрытый ключ, соединенные, например:

-----BEGIN CERTIFICATE-----  
MIIDsDCCApgCAWUwDQ....  
-----END CERTIFICATE-----  
-----BEGIN RSA PRIVATE KEY-----  
MIIEpAIBAAKCAQEAsMGypi...  
-----END RSA PRIVATE KEY-----

По какой-то причине самозаверяющий сертификат не работает для меня в ubuntu, но отлично работает в mac os.

 0
Author: theki, 2017-03-29 14:23:22