2016-11-11 1 views
2

Ich habe ein Problem bei der Verbindung von PHP mit einer API, die die Verwendung von SSL-Zertifikaten erfordert. Das Problem ist, wenn ich meinen PHP-Code ausführen bekomme ich "Konnte keine Verbindung zum Host herstellen".SOAP mit zwei Zertifikatsdateien und "Konnte keine Verbindung zum Host herstellen"

ich in der Lage war, an den Dienstanbieter verbinden CURL wie folgt aus:

$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)); 

Allerdings habe ich nicht in der Lage war, diese mit SOAP zu tun:

$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); 

Es in „nicht-Ergebnisse Verbindung zum Host ".

Das Problem möglicherweise im Zertifikat selbst, vielleicht muss ich zwei Zertifikate in einer Datei zusammenführen. Ich kann sehen, dass viele Leute das gleiche Problem haben, die meisten von ihnen haben keine Antwort bekommen.

Warum gibt der SOAP-Code "Konnte keine Verbindung zum Host herstellen" zurück und wie behebe ich ihn?

Antwort

0

für Sie einige Plätze zu starten:

1) Was genau certificate.crt ist? Ist es ein Client-Zertifikat oder ein CA-Zertifikat? Sie verwenden CURLOPT_SSLCERT (legt das Clientzertifikat fest), verwendet jedoch die Dateireferenz "cafile" in SoapClient (legt die CA-Zertifikatdatei fest).

2) Sie verwenden CURLOPT_SSL_VERIFYPEER = false, aber in dem anderen Snippet verwenden Sie verify_peer.

Versuchen Sie also, ein bisschen mehr mit diesen Änderungen zu debuggen, mit der gleichen Art von Umgebung.

+0

Dank für die Wiedergabe, wie für (1) I ein file.pfx mit Passwort haben, führen i den folgenden Befehl ein 2-Datei aus ihm openssl pkcs12 -in cert_name.pfx -nocerts -out cert_name zu extrahieren. Schlüssel und openssl pkcs12 -in cert_name.pfx -clcerts -nokeys -out certificate.crt die ich folgendes commanf openssl rsa -in cert_name.pem -out newkey.pem so bin ich verloren laufen, ich weiß wirklich nicht, Was ich jetzt habe – marvillous

+0

wie für (2) Ich habe versucht, "verify_peer" => falsch, habe ich den gleichen Fehler – marvillous

0

Wenn Ihr Zertifikat selbstsigniert ist, müssen Sie kein cafile festlegen. Kafile ist nur für CA-Kette. Zertifikat (Blatt) und den privaten Schlüssel verketteten z.B .:

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

Aus irgendeinem Grund selbst signiertes Zertifikat nicht für mich auf Ubuntu arbeiten, aber funktioniert auf Mac OS fein: local_cert beide haben muss.

Verwandte Themen