Probleme mit der Verbindung zu SSL-verschlüsselte web-service mit PHP
Habe ich zwei Zertifikat-Dateien von dem Anbieter, in einem .cer-format und eines in einem .p7b-format. Ich habe dann Umgerechnet die p7b-Zertifikat in ein p12-Zertifikat. Mit dieser Bescheinigung bin ich in der Lage zu verbinden, um die wsdl aus meinem browser.
Dann ging ich zu konvertieren, das Zertifikat zu .pem-format, mit einige Anweisungen, die ich fand auf dieser Seite.
openssl pkcs12 -clcerts -nokeys -out test.pem -in mycert.p12
openssl pkcs12 -nocerts -out key.pem -in mycert.p12
dann kämmen Sie das Zertifikat mit dem Schlüssel mithilfe des folgenden Befehls:
cat test.pem key.pem > cert.pem
Hier ist mein Konstrukt für die web-service-Klasse:
public function __construct() {
$wsdl_url = 'https://url.to/web_service?wsdl';
$pass = 'passphrase';
$cert = 'cert.pem';
try {
$this->client = new SoapClient($wsdl_url, array('local_cert' => $cert, 'passphrase' => $pass));
} catch(SoapFault $e) {
print_r($e);
}
}
Und hier ist der Fehler:
SSL operation failed with code 1. OpenSSL Error messages: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca in /var/www/html/..
Versucht, um das Zertifikat zu überprüfen mit:
openssl verify cert.pem
gibt mir die folgende Fehlermeldung:
error 20 at 0 depth lookup:unable to get local issuer certificate
Ich habe auch versucht, die Schaffung der .pem-Zertifikat mit dem folgenden openssl-Befehl:
openssl pkcs12 -in mycert.p12 -out mycert.pem
Überprüfen, das gibt mir ein OK, aber PHP gibt mir die folgende Fehlermeldung:
Unable to set local cert chain file `mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer
Ich nehme an, es sollte möglich sein, damit es funktioniert irgendwie, wie ich bin in der Lage, den Zugriff auf die wsdl über meinen browser, mit dem .p12-Zertifikat. Aber ich bin nicht in der Lage zu finden, eine Lösung, wie ich Vorgehen sollte.
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie haben ein paar Probleme hier. Erstens, ich glaube nicht, dass Ihre Optionen für die lokale Zertifikat verwendet werden, indem der Konstruktor der SoapClient-Objekt. Das options array unterstützt nicht die SSL-config-Optionen. Zweitens, gegeben, dass die Optionen, die Sie liefern, um dem SoapClient nicht verwendet werden Open SSL beschwert sich über das Zertifikat auf dem remote-host, ein selbst zertifiziertes Zertifikat.
Ich denke, es sollte möglich sein, dies zu umgehen, aber ohne zu spielen, mit dem code kann ich nicht sicher sein, dass auf alle Optionen. Ich denke, dass müssen Sie erstellen eine benutzerdefinierte stream Zusammenhang mit stream_context_create (), um die SSL-Optionen, die Sie benötigen (haben Sie einen Blick auf http://ca.php.net/stream_context_create und Kontext-Optionen für SSL). Diese kann dann weitergegeben werden, um das SoapClient-Objekt als option stream_context in der config-array. Mit der stream_context können Sie die verschiedenen SSL-Optionen, die Sie benötigen und diese überschreiben die Standardwerte.
Tut mir Leid, ich kann nicht mehr präzise auf die Optionen, die Sie einstellen müssen. Hoffentlich spielen um mit dem stream-Kontext lösen Ihr Problem.
Ich denke, dass es nicht finden kann, wird das root-Zertifikat ausgestellt wurde das Zertifikat, das Sie zur Verfügung gestellt wurden.
Zertifikate sind normalerweise signiert und ausgestellt von einem Zeichnungsberechtigung, und Ihr Kunde muss wissen, der öffentliche Schlüssel der signierenden Behörde. Wenn Ihr Zertifikat ist ein selbst signiertes Zertifikat, dann ist es nicht so wichtig.
Überprüfen
openssl x509 -text -noout -in key.pem
Überprüfen Sie die Ausgabe, und suchen für die Emittenten. Wenn der Emittent ist nicht das gleiche wie der CN des Zertifikats, dann müssen Sie ein Stammzertifikat von der Unterzeichnung der Behörde, sofern Ihr Zertifikat.
Normalerweise können Sie schnappen Sie es mit einem browser öffnen Sie die wsdl-Adresse und die überprüfung der Zertifikatkette und exportieren das root-Zertifikat von der Hierarchie tab.
Wo Sie es gespeichert haben, in Ihrer situation, ich bin mir nicht sicher, aber es wird etwas sein, zu einem Punkt der trust store-einige geben.