Der Fall: Ich möchte die SSL-Verbindung zu localhost
öffnen, während das SSL-Zertifikat Probleme mit dem FQDN hat.
Das Problem: Ohne spezielle Behandlung in Zeile (*)
schlägt das folgende Programm mit der folgenden Meldung fehl:
PHP Warning: stream_socket_enable_crypto(): Peer certificate CN='myhost.com' did not match expected CN='localhost' in test.php
Das PHP-Testprogramm:
%Vor% Da ich viel älteren Code habe, würde ich gerne eine Lösung haben, indem ich nur Änderungen an php.ini
(oder CLI) anwende, aber leider funktioniert keiner der folgenden:
php -d verify_peer_name=false test.php
php -d ssl.verify_peer_name=false test.php
Ideen?
Referenzen:
Wenn cafile
und capath
gleichzeitig Laufzeitkonfiguration und SSL-Kontextoptionen , verify_peer_name
und verify_peer
sind nur SSL-Kontextoptionen .
Diese beiden letzteren können also nicht über Laufzeit-Konfigurationsdirektiven geändert werden.
Ich kann die Verwirrung aus der Dokumentation nachvollziehen, die hier wiedergegeben wird, aber diese beiden Absätze beziehen sich eigentlich auf zwei verschiedene Konzepte in PHP.
Das Standard-CA-Paket kann auf globaler Ebene überschrieben werden Entweder die Konfigurationseinstellung openssl.cafile oder openssl.cafath, oder auf einer pro Anfrage Basis mit den Cafile oder Capath Kontextoptionen.
Obwohl dies generell nicht empfohlen wird, ist es möglich Peer zu deaktivieren Zertifikatsüberprüfung für eine Anfrage durch Setzen des verify_peers context-Option auf FALSE, und Peer-Namen-Validierung durch zu deaktivieren Setzen Sie die context-Option verify_peer_name auf FALSE.
Beachten Sie zunächst, dass die Dokumentation selbst eine deutliche Differenz zwischen openssl.cafile
und openssl.capath
auf globaler Basis oder pro Anfrage und verify_peer
macht. und verify_peer_name
ist nur für eine Anfrage .
Das bedeutet also im Grunde, dass openssl.cafile
und openssl.capath
sowohl über php.ini
als auch über stream_context_set_option
angepasst werden können, andererseits sind verify_peer
und verify_peer_name
nur über stream_context_set_option
erreichbar.
Dies wird auch durch den PHP-Quellcode selbst bestätigt, hier sind einige Zeilen, die zeigen, dass PHP
underlaying C
language nur den Wert von php_stream_context_get_option
erhält.
Hier ist zur Verdeutlichung die Deklaration des Makros GET_VER_OPT
Wenn cafile
und capath
tatsächlich zuerst mit php_stream_context_get_option
value abgeglichen werden, aber wenn diese im Kontext NULL
sind, werden sie dann in der ini-Konfiguration abgerufen.
Dann etwas tiefer in genau der gleichen Funktion:
%Vor%Link zum Quellcode von PHP github
> Hier ist zur Verdeutlichung die Deklaration des Makros GET_VER_OPT_STRING
Sie können auch sehen, dass, wenn diese beiden Werte openssl.capth
und openssl.cafile
sind definiert als bestehende ini
Konfiguration, die spätere verify_peer
und verify_peer_name
sind nirgendwo zu finden.
Leider ist der einzige Weg zu gehen, wie die Dokumentation es fordert, es für eine Anfrage über stream_context_set_option ( $stream_or_context , 'ssl' , 'verify_peer_name' , false )
Bitte beachten Sie auch : Der Standardwert dieser beiden SSL-Kontextoptionen wurde in PHP Version 5.6.0 geändert, wie in der Dokumentation gefordert:
5.6.0 peer_fingerprint und verify_peer_name hinzugefügt. Der Standardwert von verify_peer wurde auf TRUE geändert.
Was bedeutet, dass diese Art von Problem auftreten kann, nachdem ich PHP von PHP < 5.6.0
aktualisiert habe, auch wenn ich das nicht empfehle, da PHP 5.5
nähert sich dem Ende des Supportzyklus , der Standardwert dieser beiden Optionen kann auf false gehalten werden, indem eine PHP
-Version kleiner als 5.6.0
beibehalten wird.