2014-11-07 3 views
8

Der Fall: Ich möchte SSL-Verbindung zu localhost öffnen, während SSL-Zertifikat Probleme für FQDN war.Wie setze ich 'verify_peer_name = false' SSL Kontext Option über PHP.ini in PHP 5.6

Das Problem: Ohne besondere Behandlung im Einklang (*) das Programm unten mit der folgenden Meldung fehlschlägt:

PHP Warning: stream_socket_enable_crypto(): Peer certificate CN='myhost.com' did not match expected CN='localhost' in test.php

Der Test PHP-Programm:

$fp = stream_socket_client("tcp://localhost:993", $errno, $errstr, 30); 

// (*) if commented, the program fails 
//stream_context_set_option($fp, 'ssl', 'verify_peer_name', false); 

if (!$fp) { 
     die("Unable to connect: $errstr ($errno)"); 
} 
if (!stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { 
     die("Failed to start SSL"); 
} 
fwrite($fp, "USER god\r\n"); 
fwrite($fp, "PASS secret\r\n"); 
while ($motd = fgets($fp)) { 
     echo $motd; 
} 
fclose($fp); 

Da ich viel Vermächtnis haben Code, ich würde gerne eine Lösung haben, nur Änderungen an php.ini (oder CLI) anwenden, aber leider keiner der unten funktioniert:

php -d verify_peer_name=false test.php

php -d ssl.verify_peer_name=false test.php

Ideen?

Referenzen:

+0

Dies ist nur eine Warnung, es sollte nicht fehlschlagen – cmorrissey

+2

Es gibt eine Warnung an die Konsole, aber tatsächlich 'stream_socket_enable_crypto()' gibt 0 (fehlschlägt) zurück. –

+0

Haben Sie die Lösung dafür gefunden? – Thibault

Antwort

7

TL;

DR

Wenn cafile und capath zugleich sind runtime configuration und SSL context options, verify_peer_name und verify_peer sind nur SSL context options.

Also diese späteren zwei können nicht über Laufzeitkonfiguration Richtlinien geändert werden.


ich die Verwirrung aus der Dokumentation hier unter reproduziert verstehen können, aber diese beiden Absätze beziehen sich eigentlich anderes Konzept in PHP zwei.

Der Standard CA-Bundle kann Kontext mit Hilfe der CaFile oder capath indem entweder die openssl.cafile oder openssl.capath Konfigurationseinstellung, oder auf einer pro Anfrage Basisauf globaler Basis außer Kraft gesetzt werden Optionen.

Während im Allgemeinen nicht empfohlen wird, ist es möglich, Peer Zertifikat-Verifizierungs für eine Anforderung, indem die verify_peer Kontext Option auf FALSCH zu deaktivieren, und Peer-Namensvalidierung durch Einstellung der verify_peer_name Kontext Option auf FALSCH zu deaktivieren.

Link to PHP manual source

Zunächst ist zu beachten, dass die Dokumentation selbst einen klaren Unterschied zwischen openssl.cafile und openssl.capath macht auf globaler Basis zu sein oder auf einer pro Anfrage Basis gegen verify_peer und verify_peer_namefür eine Anforderung sein nur. So bedeutet

, dass im Grunde, dass, wenn openssl.cafile und openssl.capath können sowohl über php.ini oder über stream_context_set_option angepasst werden, auf der anderen Seite verify_peer und verify_peer_name sind nur über stream_context_set_option.

Dies wird auch von PHP-Quellcode selbst bestätigt, hier sind einige Zeilen, die zeigen, dass PHP unterlagernden C Sprache erhält den Wert von php_stream_context_get_option nur.

must_verify_peer_name = GET_VER_OPT("verify_peer_name") 
     ? zend_is_true(val) 
     : sslsock->is_client; 

Link to PHP github source code

Aus Gründen der Übersichtlichkeit ist hier die Erklärung des Makro GET_VER_OPT

#define GET_VER_OPT(name)    (PHP_STREAM_CONTEXT(stream) && (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", name)) != NULL) 

Link to PHP github source code

Wenn cafile und capath tatsächlich zuerst abgestimmt gegen php_stream_context_get_option Wert, aber dann, wenn diese NULL in der Kontext werden sie dann in der Ini-Konfiguration abgerufen.

GET_VER_OPT_STRING("cafile", cafile); 
GET_VER_OPT_STRING("capath", capath); 

if (cafile == NULL) { 
    cafile = zend_ini_string("openssl.cafile", sizeof("openssl.cafile")-1, 0); 
    cafile = strlen(cafile) ? cafile : NULL; 
} 

Link to PHP github source code

Dann ein wenig tiefer in die exakt gleiche Funktion:

if (capath == NULL) { 
    capath = zend_ini_string("openssl.capath", sizeof("openssl.capath")-1, 0); 
    capath = strlen(capath) ? capath : NULL; 
} 

Link to PHP github source code

Aus Gründen der Übersichtlichkeit ist hier die Erklärung des Makro GET_VER_OPT_STRING

#define GET_VER_OPT_STRING(name, str) if (GET_VER_OPT(name)) { convert_to_string_ex(val); str = Z_STRVAL_P(val); } 

Link to PHP github source code

Sie können auch sehen, dass, wenn die beiden Werte openssl.capth und openssl.cafile als bestehende ini Konfiguration definiert werden, die später verify_peer und verify_peer_name sind nirgendwo gefunden werden.

So traurig der einzige Weg zu gehen, da die Dokumentation es veranlasst, ist es über stream_context_set_option ($stream_or_context , 'ssl' , 'verify_peer_name' , false)



Bitte beachten Sie auch für eine Anfrage zu konfigurieren: der Standardwert dieser beiden SSL Kontextoptionen geändert in PHP Version 5.6.0, wie von der Dokumentation aufgefordert:

5.6.0 peer_fingerprint und verify_peer_name hinzugefügt. Der Standardwert von verify_peer wurde auf TRUE geändert.

Link to PHP documentation

Was bedeutet, dass diese Art von Problem so PHP von PHP < 5.6.0 nach der Aktualisierung auftreten kann, auch wenn ich das nicht empfehlen, da PHP 5.5 is coming to the end of is support life cycle, der Standardwert dieser beiden Optionen kann zu falsch gehalten werden indem man an einer PHP Version niedriger als 5.6.0 klebt.

+1

Ausgezeichnete Antwort übrigens; Ich warte [bis die Bounty-Periode zu Ende geht] (http://meta.stackoverflow.com/questions/323729/boundy-etiquette-early-awards) bevor ich die Preise bekomme, aber ich kann mir nicht vorstellen, dass irgendjemand auf sie kommt eine bessere Antwort als das. – miken32

+0

Der Link zum Meta-Beitrag wurde auf den ersten Blick nicht in Ihrem Kommentar angezeigt. Ich denke, es ist absolut fair, das Kopfgeld offen zu lassen, wirklich, mach dir keine Sorgen. –

Verwandte Themen