2014-11-21 2 views
5

Ich versuche, einen Soap-Client mit dem folgenden Code ein:PHP SOAP-Client mit Zertifikaten über SSL

<?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); 
} 

ich eine P12-Schlüssel-Datei mit einer .crt Zertifizierungsdatei gegeben wurde. Mit openssl habe ich die .p12-Datei in eine .pem-Datei konvertiert und dann mit der .crt-Datei zusammengeführt. Das CertWithKey.pem sieht gut aus, zwei Zertifikatsblöcke sind in der Datei.

Egal was ich versuche zu tun, bekomme ich immer eine Ausnahme mit der Nachricht SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl".

Nach dem Telefonieren mit der Gegenstelle bestätigen sie, dass eine Anfrage eingeht, aber sie protokollieren diesen Fehler: ssl handshake interrupted by system [hint: stop button pressed in browser?!].

Da ich bis jetzt keine brauchbaren Informationen im Netz gefunden habe, habe ich mir vorgenommen, euch um einen Einblick zu bitten.

Irgendwelche Vorschläge, was versucht werden kann? Ich benutze PHP 5.3.8 und die IP-Adresse des Servers ist in der Firewall der Gegenseite weiß aufgeführt.

Antwort

4

Ich habe dieses Problem behoben. Ich denke, aufgrund der Anzahl der Fragen zu diesem Thema und der Anzahl der verschiedenen Lösungen werden andere von der Lösung profitieren. Hier gehts:

Ich benutzte das CLI-Programm openssl, um die .p12 Schlüssel-Datei in eine .pem Schlüsseldatei umzuwandeln. Der Trick ist die Art der Umwandlung.

Zuerst konvertierte ich es mit diesem Befehl und ich hatte das Problem, wie in der Frage beschrieben:

openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts

Während der Befehl unter dem eigentlichen Trick tat:

openssl pkcs12 -in key.p12 -out key.pem -clcerts

Für Weitere Informationen finden Sie in der Quelle, die ich verwendete: https://community.qualys.com/docs/DOC-3273

+0

Ich versuche auch, SOAP-Anfrage an einen Server zu senden. Ich stehe vor einem ähnlichen Problem, bei dem ich nicht in der Lage bin, über meine PHP-Anwendung mit dem Server zu kommunizieren. funktioniert aber über SOAP GUI. Ich habe eine .p12-Datei, die ich versucht habe, indem ich in .pem-Datei umwandelte. Wenn ich das SOAP-Client-Objekt zu erstellen, erhalte ich die Fehlermeldung: SOAP-Fehler: Das Parsen WSDL: Kann nicht aus https laden: // wsdl: fehlgeschlagen externe Einheit https laden: // Wsdl Can erzählst du mir bitte, was hier schief läuft? –

+0

Wenn Sie meine Antwort befolgt haben und die Schlüssel- und CRT-Dateien erfolgreich zusammengeführt wurden, ist auf dem Remote-Host möglicherweise eine Firewall aktiviert und blockiert Ihre IP-Adresse. Ansonsten kann ich noch nicht sagen, vielleicht solltest du dann eine Frage stellen. – Ben

+0

Ich hatte das gleiche Problem. Und ich folgte genau den Schritten, die @Ben zur Verfügung gestellt hat. Der p12 musste in .pem konvertiert werden, indem der angegebene Link verwendet wurde. Aber ich bekam immer noch den Fehler: curl: (58) Client cert nicht laden -8018 Seltsamerweise dachte ich, dass die Passphrase, die ich zur Verfügung stellte, 3 war -Ziffern "123", stattdessen musste ich eine gültige Passphrase mit 6 Buchstaben angeben. Also ich glaube, es sollte eine einige gute Länge Passphrase (nicht wissen, die min-Länge) .Die nächste, die fehlte war 'local_cert', 'Passphrase' Optionen, die in der Initialisierung des SoapClient-Objekts angegeben werden sollte. –

-1

Gleiche Vorschläge:

  1. Ich benutze Soapclient mit SSL Services zu verbinden, und alles funktioniert gut ohne "Endpunkt" URL angeben. Dann empfehle ich Ihnen, ohne diese Option auszuprobieren;

  2. Der php SoapClient hat eine Option namens "ssl_method", wo Sie einige Variationen dieses Protokolls ändern können. Versuchen Sie, diesen Parameter zu ändern/anzugeben, wenn Sie wissen, welches Protokoll verwendet wird;

  3. Geben Sie "verifypeer => false" und "verifyhost => false" in der Parameterliste an;

+0

Vielen Dank für Ihre Antwort. '1:' Ich habe es auch ohne den Endpunkt versucht; ohne Glück. '2:' Aufgrund meiner PHP-Version kann ich ssl_method nicht verwenden. '3:' Falsche oder verifypeer und verifyhost undokumentierte Parameter (oder zumindest sind sie nicht in der docs: http://php.net/manual/en/soapclient.soapclient.php). Kein Unterschied bei der Lieferung von ihnen. – Ben

+0

'Geben Sie" verifypeer => false "und" verifyhost => false "in der Parameterliste an;' Dies bedeutet, dass die Sicherheit deaktiviert wird. immer eine schlechte Idee –