2013-09-24 5 views
15

Ich benutzte cURL auf meinem localhost für die längste Zeit und auf einmal bemerkte ich, dass es nicht mehr funktioniert, bis ich explizit die Option CURLOPT_SSL_VERIFYPEER = FALSE gesetzt habe.cURL erfordert CURLOPT_SSL_VERIFYPEER = FALSE

Ich habe keine Ahnung, wie/wann das geändert, aber ich benutze NGINX und PHP und ich kann überprüfen, dass dies kein spezifisches Problem für einen bestimmten angeforderten Host ist. Ich bekomme leere Antworten von https://site1.com und https://different-site.com.

Wer hat irgendwelche Gedanken?

+0

Ich liebe dieses [verstecktes Juwel] (http://StackOverflow.com/a/12293898/), es erklärt, wie Sie Zertifikate verwenden können, um Hosts zu überprüfen. –

+0

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/ – Young

+0

@DaveChen und - @ Young danke, aber hast du ein Sinn, warum ich vorher kein Zertifikat liefern musste, aber jetzt? –

Antwort

28

Dank Dave Chens Vorschlägen wurde mir klar, dass ich mein Zertifikat verlegt haben musste. Das Problem wird durch dieses Zertifikat gelöst, die durch den Curl-Schöpfer vorgesehen ist: http://curl.haxx.se/ca/cacert.pem

So nach dieser cacert.pem Datei in Ihr Projekt herunterladen, in PHP können Sie jetzt tun:

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

, Alternativ kann diese kann

curl.cainfo=/path/to/cacert.pem 
+0

Brilliant, das hat für mich funktioniert! – Contango

+5

Ich bin kein Sicherheitsexperte, aber Download .pem Datei Formular unsichere Quelle (http :) kann vertraut werden? – Gihan

+0

In beiden Richtungen versucht. Keine funktionierte. – LXXIII

1

Sie können dies tun, um Ihre php.ini, indem Sie folgende global gesetzt werden:

curl_setopt ($ ch, CURLOPT_SSL_VERI FYPEER, wahr);
curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt ($ ch, CURLOPT_CAINFO, getcwd(). "/pfad/cert.pem");

Die andere Option, die ich aufgenommen habe, kann CURLOPT_SSL_VERIFYHOST auf folgende ganzzahlige Werte eingestellt werden:

0: den gemeinsamen Namen (CN) Attribut nicht Sie überprüfen
1: Überprüfen Sie, dass die gemeinsame Attributnamen an dest existiert
2: Überprüfen Sie, ob der gemeinsame Name vorhanden ist, und es entspricht dem Host-Namen des Servers

Wenn Sie CURLOPT_SSL_VERIFYPEER auf false gesetzt, dann aus Sicht der Sicherheit, ist es nicht wirklich wichtig, das tut, was du hast setze CURLOPT_SSL_VERIFYHOST auf, da ohne Peer-Zertifikat-Verifizierung der Server a ny-Zertifikat, einschließlich eines selbstsignierten Zertifikats mit garantiertem CN, das dem Hostnamen des Servers entspricht. Diese Einstellung ist also nur relevant, wenn Sie die Zertifikatsprüfung aktiviert haben.

1

Wenn Sie WampServer verwenden, Bekanntmachung:

Sie müssen den absoluten Pfad setzen in CURLOPT_CAINFO, zum Beispiel:

curl_setopt ($ch, CURLOPT_CAINFO, 'C:\wamp\www\your-project\cacert.pem') 

relativen Pfad nicht Verwenden Sie: curl_setopt ($ ch, CURLOPT_CAINFO, 'cacert.pem') weil es nicht funktioniert.