PHP - get_file_contents und HTTPS
-
Ich habe hier einen Java-Chatserver und ein PHP-Skript versucht sich mit diesem über HTTPS zu verbinden. Das vom Server verwendete Zertifikat ist selbst-signiert.
Die Funktion sieht im Moment so aus:private function file_get_contents($url) { echo($url); //zu Debugzwecken return file_get_contents($url, null, stream_context_create(array( 'http' => array( 'header' => 'Connection: close', 'ignore_errors' => true ), 'ssl' => array( 'verify_peer' => false, 'allow_self_signed' => true )))); }
Ich sitze schon den ganzen Tag da dran, aber die Funktion weigert sich was anderes als false zurückzugeben. Wenn ich die URL so in den Browser kopiere, dann funktioniert es (nachdem ich eine Ausnahme für das Zertifikat hinzugefügt habe), aber PHP weigert sich.
Folgender Fehler tritt auf:
file_get_contents(): Failed to enable crypto
Auf dem Server läuft Ubuntu 12.04. Woran könnte das liegen?
Im Internet ist z.B. von Inkompatibilitäten zwischen openssl 0.9.8 und 1.0.0 die Rede, aber das ist sieben Jahre her.
-
liegt vermutlich nicht an dem Zertifikat. Das sollte durch deinen Stream-Kontext angenommen werden.
Aber auf was anderes bin ich gestoßen:
https://bugs.php.net/bug.php?id=52106welche PHP-Version verwendest du? Solte mit 5.3 gefixt sein
-
Hmm.. die PHP-Version ist
5.3.10-1ubuntu3.2
, das sollte dann eigentlich in Ordnung gehen, oder?Anderswo meinte jemand, dass evtl. Suhosin den Request blockieren könnte.
In/etc/php5/apache2/conf.d/suhosin.ini
solle man die Konfiguration anpassen können, aber dummerweise existiert die Datei gar nicht.
Außerdem bin ich diesbezüglich etwas verwirrt, denn wenn ich php -v eingebe, bekomme ich das:
5.3.10-1ubuntu3.2 with Suhosin-Patch (cli)
Die oben genannte Version aus phpinfo() hat diesen Zusatz aber nicht. Wie muss ich das verstehen? Die CLI-Version hat den Patch, aber das Apache-Modul nicht?
-
Aha, ich glaube, ich komme der Sache näher. Ich habe die Funktion mal durch folgendes ersetzt:
private function file_get_contents($url) { $rCURL = curl_init(); curl_setopt($rCURL, CURLOPT_URL, $url); curl_setopt($rCURL, CURLOPT_HEADER, 0); curl_setopt($rCURL, CURLOPT_RETURNTRANSFER, 1); curl_setopt($rCURL, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($rCURL, CURLOPT_SSLVERSION, 3); $cData = curl_exec($rCURL); if (!$cData)echo(curl_error($rCURL)); //debug curl_close($rCURL); return $cData; }
Und bevor ich die letzte Option hinzugefügt habe, meldete das "Unknown SSL protocol error". Auch wget und (Kommandozeilen-)curl funktionieren nicht ohne zusätzliche Parameter. Vermutlich ist da was beim Chatserver kaputt.
-
Kannst du curl/wget bei dir lokal mal testen - uU ist die SSL config des PHP Servers defekt. Hatte ich schonmal dass da Zertifikate und/oder libs was hatten - neu installation des servers hatte damals das Problem gelöst.
Wartest du den PHP Server selber oder ist es ein managed/shared host?
PS:
teste auch mal den Beispielcode von hier: https://bugs.php.net/bug.php?id=53447 ob du das selbe resultat hast wie im Bug beschrieben.
-
Shade Of Mine schrieb:
Wartest du den PHP Server selber oder ist es ein managed/shared host?
Ich warte ihn selbst, ich habe da bisher auch noch nicht viel herumkonfiguriert.
Der Codeschnippsel bringt folgendes Resultatl, was eigentlich gut aussieht:
~https://cas.ucdavis.edu/cas/login - OK 5293 bytes Warning: fopen(https://server.db.kvk.nl/): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/test.php on line 6 https://server.db.kvk.nl/ - FAIL Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/test.php on line 14 https://gmail.com/ - OK 58592 bytes~Bei mir zuhause (ebenfalls Ubuntu 12.04) schlägt die Verbindung über HTTPS mit curl auch fehl (ohne das Argument
-3
), aber hier (Mac OS X 10.5) klappt es interessanterweise.
Irgendetwas läuft da offenbar beim Handshake nicht richtig. Da allerdings auf dem realen Server ebenfalls Mac OS X läuft, stellt sich das Problem u.U. da gar nicht.