it-swarm.com.de

HTTPS und SSL3_GET_SERVER_CERTIFICATE: Zertifikatprüfung fehlgeschlagen, CA ist in Ordnung

Ich benutze XAMPP für die Entwicklung. Kürzlich habe ich meine Installation von xampp von einer alten Version auf 1.7.3 aktualisiert.

Wenn ich jetzt HTTPS-fähige Sites einrolle, erhalte ich die folgende Ausnahme

Schwerwiegender Fehler: Nicht erfasste Ausnahme 'RequestCore_Exception' mit der Meldung 'cURL resource: Resource id # 55; cURL-Fehler: Problem mit dem SSL-Zertifikat. Überprüfen Sie, ob das CA-Zertifikat in Ordnung ist. Details: Fehler: 14090086: SSL-Routinen: SSL3_GET_SERVER_CERTIFICATE: Zertifikatprüfung fehlgeschlagen (60) '

Jeder schlägt vor, einige spezifische Curl-Optionen aus PHP) zu verwenden, um dieses Problem zu beheben. Ich denke, dies sollte nicht der Fall sein. Weil ich mit meiner alten Version von XAMPP kein Problem hatte und es passiert ist erst nach der installation der neuen version.

Ich brauche Hilfe, um herauszufinden, welche Einstellungen sich in meiner PHP Installation, Apache usw. ändern, um dieses Problem zu beheben.

204
Josnidhin

curl enthält eine Liste der akzeptierten Zertifizierungsstellen, bündelt jedoch keine Zertifizierungsstellenzertifikate mehr. Standardmäßig werden alle SSL-Zertifikate als nicht überprüfbar zurückgewiesen.

Sie müssen das Zertifikat Ihrer Zertifizierungsstelle erhalten und darauf zeigen. Weitere Details unter cURLS Details zu Server-SSL-Zertifikaten .

142
Marc B

Es ist ein ziemlich häufiges Problem in Windows. Sie müssen nur cacert.pem bis curl.cainfo.

Seit PHP 5.3.7 können Sie Folgendes tun:

  1. laden Sie https://curl.haxx.se/ca/cacert.pem herunter und speichern Sie es irgendwo.
  2. update php.ini - curl.cainfo = "PATH_TO/cacert.pem" hinzufügen

Andernfalls müssen Sie für jede cURL-Ressource Folgendes ausführen:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

Warnung: Dies kann zu Sicherheitsproblemen führen, vor denen SSL schützen soll und die Ihre gesamte Codebasis unsicher machen. Dies widerspricht jeder empfohlenen Vorgehensweise.

Aber eine wirklich einfache Lösung, die für mich funktionierte, war anzurufen:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

vor dem anruf:

curl_exec():

in der PHP-Datei.

Ich glaube, dass dies jede Überprüfung von SSL-Zertifikaten deaktiviert.

82
Chris Dutrow

Quelle: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Locke: Problem mit SSL-Zertifikat. Überprüfen Sie, ob das CA-Zertifikat in Ordnung ist

07. April 2006

Beim Öffnen einer sicheren URL mit Curl wird möglicherweise die folgende Fehlermeldung angezeigt:

Überprüfen Sie bei einem Problem mit dem SSL-Zertifikat, ob das CA-Zertifikat in Ordnung ist

Ich werde erklären, warum der Fehler und was Sie dagegen tun sollten.

Die einfachste Möglichkeit, den Fehler zu beheben, besteht darin, Ihrem Skript die folgenden zwei Zeilen hinzuzufügen. Diese Lösung birgt jedoch ein Sicherheitsrisiko.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Mal sehen, was diese beiden Parameter bewirken. Zitiere das Handbuch.

CURLOPT_SSL_VERIFYHOST : 1, um die Existenz eines allgemeinen Namens im SSL-Peer-Zertifikat zu überprüfen. 2, um zu überprüfen, ob ein allgemeiner Name vorhanden ist und ob er mit dem angegebenen Hostnamen übereinstimmt.

CURLOPT_SSL_VERIFYPEER : FALSE, um zu verhindern, dass CURL das Zertifikat des Peers überprüft. Alternative Zertifikate zur Überprüfung können mit der Option CURLOPT_CAINFO angegeben werden, oder ein Zertifikatverzeichnis kann mit der Option CURLOPT_CAPATH angegeben werden. CURLOPT_SSL_VERIFYHOST muss möglicherweise auch TRUE oder FALSE sein, wenn CURLOPT_SSL_VERIFYPEER deaktiviert ist (standardmäßig 2). Wenn Sie CURLOPT_SSL_VERIFYHOST auf 2 setzen (dies ist der Standardwert), wird garantiert, dass das Ihnen vorgelegte Zertifikat einen allgemeinen Namen hat, der mit der URN übereinstimmt, die Sie für den Zugriff auf die Remote-Ressource verwenden. Dies ist eine fehlerfreie Prüfung, die jedoch nicht garantiert, dass Ihr Programm nicht entschlüsselt wird.

Geben Sie den "Mann in der Mitte"

Ihr Programm könnte dazu verleitet werden, stattdessen mit einem anderen Server zu sprechen. Dies kann durch verschiedene Mechanismen wie DNS oder Arp-Vergiftung erreicht werden (Dies ist eine Geschichte für einen anderen Tag). Der Angreifer kann auch ein Zertifikat mit demselben "Comon-Namen", den Ihr Programm erwartet, selbst signieren. Die Kommunikation wäre immer noch verschlüsselt, aber Sie würden Ihre Geheimnisse einem Betrüger preisgeben. Diese Art von Angriff wird "Mann in der Mitte" genannt.

Den "Mann in der Mitte" besiegen

Nun, wir müssen überprüfen, ob das uns vorgelegte Zertifikat echt ist. Wir vergleichen dies mit einem Zertifikat, dem wir angemessen * vertrauen.

Wenn die Remote-Ressource durch ein Zertifikat geschützt ist, das von einer der Hauptzertifizierungsstellen wie Verisign, GeoTrust et al. Ausgestellt wurde, können Sie sicher mit Mozillas CA-Zertifikatspaket vergleichen, das Sie von http://curl.haxx.se /docs/caextract.html

Speicher die Datei cacert.pem irgendwo auf Ihrem Server und stellen Sie die folgenden Optionen in Ihrem Skript ein.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

für alle oben genannten Informationen gilt Folgendes: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

52
Deepak Oberoi

Die obigen Lösungen sind großartig, aber wenn Sie WampServer verwenden, funktioniert das Setzen der Variablen curl.cainfo In php.ini Möglicherweise nicht.

Ich fand schließlich, dass WampServer zwei php.ini Dateien hat:

C:\wamp\bin\Apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Der erste wird anscheinend verwendet, wenn PHP Dateien über einen Webbrowser aufgerufen werden, während der zweite verwendet wird, wenn ein Befehl über die Befehlszeile oder Shell_exec() aufgerufen wird.

TL; DR

Wenn Sie WampServer verwenden, müssen Sie die Zeile curl.cainfo Zu beidenphp.ini - Dateien hinzufügen.

16
Nate

Für die Liebe von allem, was heilig ist ...

In meinem Fall musste ich den openssl.cafile PHP config-Variable zum PEM-Dateipfad.

Ich vertraue darauf, dass es viele Systeme gibt, in denen curl.cainfo in der PHP-Konfiguration ist genau das, was benötigt wird, aber in der Umgebung, mit der ich arbeite, ist dies der Docker-Container eboraas/laravel , der Debian 8 (jessie) und PHP 5.6, das Setzen dieser Variablen hat den Trick nicht getan.

Mir ist aufgefallen, dass die Ausgabe von php -i erwähnte nichts über diese spezielle Konfigurationseinstellung, hatte aber ein paar Zeilen über openssl. Es gibt sowohl ein openssl.capath und openssl.cafile -Option, aber nur das Setzen der zweiten erlaubte Curl über PHP), um endlich mit HTTPS-URLs klarzukommen.

6

Wenn die Anwendung, mit der Sie Kontakt aufnehmen möchten, selbstsignierte Zertifikate hat, kann das Problem mit der normalen Datei cacert.pem von http://curl.haxx.se/ca/cacert.pem nicht behoben werden.

Wenn Sie sich bezüglich der Service-Endpunkt-URL sicher sind, klicken Sie im Browser darauf und speichern Sie das Zertifikat manuell im Format "X 509-Zertifikat mit Kette (PEM)". Zeigen Sie diese Zertifikatsdatei mit dem

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
4
madRai

Ich habe den gleichen Fehler bei Amazon AMI Linux.

I Gelöst durch Setzen von curl.cainfo auf /etc/php.d/curl.ini

https://Gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

Ergänzung Oktober 2018

Bearbeiten Sie diese Datei unter Amazon Linux v1

vi /etc/php.d/20-curl.ini

Diese Zeile hinzufügen

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
4
Reinaldo Mendes

Denken Sie beim Festlegen der Curl-Optionen für CURLOPT_CAINFO daran, einfache Anführungszeichen zu verwenden. Die Verwendung von doppelten Anführungszeichen führt nur zu einem weiteren Fehler. Ihre Option sollte also so aussehen:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Darüber hinaus sollte in Ihrer php.ini-Datei die Einstellung wie folgt geschrieben werden: (Beachten Sie meine doppelten Anführungszeichen)

curl.cainfo = "C:\wamp\www\mywebfolder"

Ich setze es direkt unter die Zeile, in der Folgendes steht: extension=php_curl.dll

(Nur zu Organisationszwecken können Sie es an einer beliebigen Stelle in Ihrem php.ini Platzieren. Ich platziere es nur in der Nähe einer anderen Curl-Referenz. Wenn ich also mit dem Schlüsselwort Curl suche, kann ich beide Curl-Referenzen in einem Bereich finden.)

3
LOwens1931

Ich bin hier gelandet, als ich versucht habe, GuzzleHttp (php + Apache auf Mac) dazu zu bringen, eine Seite von www.googleapis.com zu bekommen.

Hier war meine endgültige Lösung für den Fall, dass es jemandem hilft.

Sehen Sie sich die Zertifikatskette für die Domain an, bei der dieser Fehler auftritt. Für mich war es googleapis.com

openssl s_client -Host www.googleapis.com -port 443

Sie erhalten so etwas zurück:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Hinweis: Ich habe dies erfasst, nachdem ich das Problem behoben habe. Ihre Kettenausgabe sieht möglicherweise anders aus.

Dann müssen Sie sich die Zertifikate ansehen, die in PHP erlaubt sind. Führen Sie phpinfo () auf einer Seite aus.

<?php echo phpinfo();

Suchen Sie dann nach der Zertifikatsdatei, die von der Seitenausgabe geladen wurde:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Dies ist die Datei, die Sie korrigieren müssen, indem Sie die richtigen Zertifikate hinzufügen.

Sudo nano /usr/local/php5/ssl/certs/cacert.pem

Grundsätzlich müssen Sie die richtigen Zertifikatsignaturen an das Ende dieser Datei anhängen.

Sie können einige von ihnen hier finden: Möglicherweise müssen Sie andere in der Kette googeln/suchen, wenn Sie sie benötigen.

Sie sehen so aus:

example certificate image

( Hinweis: Dies ist ein Bild, damit die Benutzer Zertifikate nicht einfach aus dem Stapelüberlauf kopieren/einfügen )

Sobald sich die richtigen Zertifikate in dieser Datei befinden, starten Sie Apache neu und testen Sie.

2
TrophyGeek

Sie können versuchen, das Paket ca-certificates Erneut zu installieren, oder das betreffende Zertifikat explizit zulassen, wie in hier beschrieben.

0
site