2009-02-06 8 views
33

Ich versuche, den Inhalt einer sicheren (https) Webseite mit PHP und CURL-Bibliotheken herunterladen.lesen SSL-Seite mit CURL (php)

Allerdings ist das Lesen fehlgeschlagen und ich bekomme Fehler 60: "SSL-Zertifikat Problem, überprüfen Sie, ob das CA-Zertifikat in Ordnung ist."

auch so ... ziemlich selbsterklärend Fehler msg des

"Details: SSL3_GET_SERVER_CERTIFICATE Zertifikat verify failed".

Meine Frage ist: Wie sende ich ein SSL-Zertifikat (das richtige?) Und bekomme diese Seite, um es zu überprüfen und mich reinzulassen?

Auch hier ist meine Optionen Array, falls Sie sich fragen:

$options = array(
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_USERAGENT  => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x", // who am i 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
     CURLOPT_SSL_VERIFYHOST => 1, 
    ); 

Irgendwelche Vorschläge wäre toll, Andrew

+0

Denken [dieser Artikel] (http://curl.haxx.se/docs/sslcerts. html) ist was du brauchst. – Sergii

Antwort

48

Es klingt wie Sie den Fehler falsch interpretiert werden könnten. Es sieht für mich so aus, als wäre die Seite, mit der Sie sich verbinden, selbstsigniert oder ein anderes häufiges Problem. Wie bei der üblichen Browserwarnung ist es am einfachsten, die Prüfungen zu deaktivieren.

Sie müssen CURLOPT_SSL_VERIFYPEER und CURLOPT_SSL_VERIFYHOST auf FALSE setzen. Dies sollte die zwei Hauptprüfungen deaktivieren. Sie werden vielleicht nicht beide benötigt, aber das sollte dich zumindest in Gang bringen.

Um klar zu sein, deaktiviert dies eine Funktion, die Sie schützen soll. Tun Sie dies nur, wenn Sie das Zertifikat und den Server auf andere Weise verifiziert haben.

Mehr Infos auf der PHP-Website: curl_setopt()

+0

ya, ... ich habe diesen Artikel vorher gelesen, ... aber das Setzen dieser beiden Werte auf falsch ergab keinen Sinn für mich ... ich glaube, ich weiß nicht wirklich, was vor sich geht. aber es hat perfekt funktioniert. so danke :) – Andrew

+0

das hat mir Stunden Arbeit gerettet !!! Vielen Dank ! – liveandream

+13

Tun Sie das nicht. ES IST INSECURE. Stattdessen: http://docforge.com/wiki/PHP/Curl –

0

Sie sind nicht das SSL-Zertifikat zu senden. Es scheint ein Problem mit dem SSL-Zertifikat zu bestehen, da es auf dem Host installiert ist, mit dem Sie Kontakt aufnehmen. Verwenden Sie die Option -k oder --insecure, um an der Beschwerde vorbeizukommen.

Ah. Siehe Ryan Grahams Antwort

2

Dies ist ein "Problem" mit OpenSSL und VeriSign.

Ich hatte ein ähnliches Problem und mein openssl fehlte das SSL-Zwischenzertifikat, das von VeriSign verwendet wurde, um das Serverzertifikat zu signieren.

https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657

Ich hatte diese Zwischenzertifikate von VeriSign Homepage oder Firefox cert-Datenbank-Export in meinem lokalen CA-Zertifikate Liste und nach diesem Schritt die geschützt verwenden konnte ich importieren wget/curl verwenden Verbindung ohne Fehler.

+1

Könnten Sie bitte helfen mit http://stackoverflow.com/questions/10102225/curl-ssl-certificates – MrPHP

21

Wenn Sie SSL-Peer-Überprüfung verwenden möchten (Drehen es ausgeschaltet ist nicht immer gute Idee), die Sie nächste Lösung unter Windows global für alle Anwendungen verwenden können:

  1. Download-Datei mit Root-Zertifikate von hier: http://curl.haxx.se/docs/caextract.html
  2. Hinzufügen zu php.ini:

curl.cainfo=C:/path/to/cacert.pem

, die alle Magie ist, kann ROTATION jetzt Zertifikate überprüfen.

(wie ich weiß, dass es auf Linux, zumindest auf Ubuntu kein solches Problem ist)

+1

Dies tat es! Ich hatte dieses Problem auf Centos 6 ... so scheint es, dass nicht alle Distributionen immun sind :) –

6

Auch nach Beratung im Anschluss an SO .. Sie können immer noch Probleme haben, mit einem Fehler wie:

error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error 

das Problem ist mit der SSL-Version. Verwenden Sie die folgenden für die Version 3

curl_setopt($ch, CURLOPT_SSLVERSION,3) 

Ich gehe davon aus, dass u Überprüfung von Peer und Host aktiviert hat, wie gut und zeigt auf eine tatsächliche Zertifikatsdatei. Z.B.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cacert.pem"); 
+2

CURLOPT_SSLVERSION reparierte es für mich, danke! – Chris

0

Dies ist offenbar auf openssl Bug. Tomcat kann um diese so konfiguriert werden, in /etc/tomcat7/server.xml zu arbeiten, indem sie die verfügbaren Cipher Liste zu beschränken:

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>