Curl: Problem mit dem 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 der folgende Fehler angezeigt:
Überprüfen Sie beim 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.
Der einfachste Weg, den Fehler zu beseitigen, 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. Das Handbuch zitieren.
CURLOPT_SSL_VERIFYHOST : 1, um das Vorhandensein eines gemeinsamen Namens im SSL-Peer-Zertifikat zu überprüfen. 2, um das Vorhandensein eines allgemeinen Namens zu überprüfen und um sicherzustellen, dass er mit dem angegebenen Hostnamen übereinstimmt.
CURLOPT_SSL_VERIFYPEER : FALSE, um zu verhindern, dass CURL das Zertifikat des Peers überprüft. Alternative Zertifikate, gegen die geprüft werden soll, 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 sichergestellt, 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 gesunde Prüfung, die jedoch nicht garantiert, dass Ihr Programm nicht enttäuscht wird.
Geben Sie den "Mann in der Mitte"
Ihr Programm könnte irregeführt werden, stattdessen mit einem anderen Server zu sprechen. Dies kann durch verschiedene Mechanismen erreicht werden, wie z. B. DNS oder Arp-Vergiftung (Dies ist eine Geschichte für einen anderen Tag). Der Eindringling kann auch ein Zertifikat mit demselben "Comon-Namen" selbst signieren, den Ihr Programm erwartet. Die Kommunikation wäre immer noch verschlüsselt, aber Sie würden Ihre Geheimnisse an einen Betrüger weitergeben. 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 wirklich gut ist. Wir tun dies, indem wir es mit einem Zertifikat vergleichen, dem wir vernünftigerweise 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 Zertifizierungsstellenpaket vergleichen, das Sie unter
http://curl.haxx.se/docs/caextract erhalten .html
Speichern Sie die Datei cacert.pem
irgendwo auf Ihrem Server und legen Sie die folgenden Optionen in Ihrem Skript fest.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");