2016-11-11 6 views
2

У меня проблема с PHP с API, который требует использования сертификатов SSL. Проблема в том, что когда я запускаю свой PHP-код, я получаю «Не могу подключиться к хосту».SOAP с двумя файлами сертификатов и «Не удалось подключиться к хосту»

я смог подключиться к поставщику услуг с помощью 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 возвращает «Не удалось подключиться к хосту» и как его исправить?

ответ

0

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

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

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

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

+0

спасибо за переигровку, , как для (1) У меня есть один file.pfx с паролем, я выполните следующую команду для извлечения 2 файла из него OpenSSL PKCS12 -in cert_name.pfx -nocerts отъезда cert_name. ключ и OpenSSL PKCS12 -в cert_name.pfx -clcerts -nokeys -out certificate.crt я бегу следующие commanf OpenSSL RSA -in cert_name.pem -out newkey.pem , так что я потерял, я действительно не знаю, что у меня есть – marvillous

+0

как и для (2) Я попытался установить 'verify_peer' => false, я получил ту же ошибку – marvillous

0

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

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

По какой-то причине сертификатом, не работают для меня на Ubuntu, но отлично работает на Mac OS.

 Смежные вопросы

  • Нет связанных вопросов^_^