Wie erzwinge ich eine bestimmte TLS-Version in einem PHP-Stream-Kontext für den ssl: // -Transport?

8

Wie kann ich TLSv1.0 in einem PHP-Stream-Kontext erzwingen, wenn ich versuche, auf eine https URL zuzugreifen?

Ich suche nach etwas in der Art:

%Vor%

Hintergrund

Tatsächlich habe ich ein Problem in Ubuntu 12.04 , wenn ich mit PHP's arbeite < a href="http://php.net/manual/de/class.soapclient.php"> SoapClient . Leider unterstützt der Server, zu dem ich eine Verbindung herstellen möchte, nur SSLv3.0 / TLSv1.0 und schlägt bei der standardmäßigen TLSv1.1-Aushandlung fehl. Daher möchte ich explizit das Protokoll des ssl:// -Transports auf TLSv1.0 setzen.

    
Chriki 14.05.2013, 15:27
quelle

4 Antworten

11

PHP 5.6+ Benutzer

Dies ist eine neue Funktion, die auf der PHP 5.6 OpenSSL-Änderungen dokumentiert ist Seite .

PHP5.6 befindet sich zum Zeitpunkt des Schreibens in Beta1 und ist daher nicht besonders nützlich. Menschen der Zukunft - Glückspilz!

Die Zukunft steht vor der Tür. PHP 5.6 ist eine Sache und seine Verwendung sollte gefördert werden. Beachten Sie, dass einige allgemein verwendete Dinge wie mysql_ * -Funktionen nicht mehr empfohlen werden, daher sollte beim Upgrade darauf geachtet werden.

Alle anderen

@toubsen ist in seiner Antwort richtig - das ist nicht direkt möglich. Um die vorgeschlagenen Problemumgehungen näher zu erläutern ... Bei der Lösung eines Problems, bei dem der API-Server eines Anbieters TLSv1.2 nicht korrekt auf das unterstützte TLSv1.0 aushandelte, schien das Senden einer kleinen Teilmenge von Verschlüsselungen die korrekte Ausführung der Aushandlung zu ermöglichen. Stream-Kontextcode ist:

%Vor%

SOAP-Benutzer

Der SOAP-Client von PHP verwendet curl nicht und scheint auch nicht den Standardkontext zu verwenden, der mit stream_context_set_default festgelegt wurde. Daher muss der erstellte Kontext im 2. Parameter als solcher an den SOAPClient-Konstruktor übergeben werden:

%Vor%

Warum diese Chiffren?

Wenn Sie den Befehl openssl ciphers auf dem Server ausführen, erhalten Sie eine Liste der unterstützten Verschlüsselungen im obigen Format. Wenn Sie openssl ciphers -v ausführen, erhalten Sie diejenigen, die TLSv1.2-spezifisch sind. Die obige Liste wurde aus allen Nicht-TLSv1.2-Verschlüsselungen zusammengestellt, die von OpenSSL gemeldet wurden.

openssl ciphers -v | grep -v 'TLSv1.2' | cut -d ' ' -f 1 | tr "\n" ':'

    
phil-lavin 17.04.2014, 10:21
quelle
2

Falls jemand wissen möchte, wie TLSv1.0 beim Erstellen einer SOAP-Anfrage "deaktiviert" wird ...

%Vor%

Der Schlüssel hier ist die stream-Kontext -Chips -Zeile. Dies bedeutet, dass Sie die Standardchiffren verwenden, aber TLSv1.0-Chiffren ausschließen (das 1.0-Paket enthält auch TLSv1.1-Chiffren). Das: ist das Chiffre-Paket-Trennzeichen (was zwischen Paketen geht) und das! Hier ist es zu sagen, um dieses Paket auszuschließen (es ist eine harte Ausschluss, also wenn es später in der Liste angezeigt wird, wird es immer noch ausgeschlossen). Soft-Ausschluss ist - Zeichen und am Ende der Liste ist + Zeichen hinzuzufügen. Um etwas hinzuzufügen, fügen Sie es einfach ohne etwas davor hinzu.

Verschlüsselungsinformationen hier: Ссылка

Bearbeiten: Aus welchem ​​Grund auch immer, einschließlich der

%Vor%

Teil von den Optionen verursachte mir wirklich Kopfschmerzen und würde in bestimmten Kontexten keine Verbindung herstellen. Nach einer ganzen Reihe von Problemen mit der Fehlersuche und dem Herumspielen mit Optionen wurde mir schließlich klar, dass das Entfernen dieser Einstellung und das Aktivieren dieser Einstellung das Problem gelöst zu haben scheint.

    
Robert McMahan 16.10.2017 18:48
quelle
1

Basisinformationen

Das Feld protocol_version ist nur für den HTTP-Kontext gültig (HTTP 1.0 vs. 1.1), hat jedoch keinen Einfluss auf den SSL-Kontext.

Die folgende Handbuchseite listet alle Stream-Kontextoptionen für PHP auf: Kontextoptionen und Parameter

Für alle SSL-basierten Stream-Wrapper sind nur die folgenden Optionen verfügbar: SSL-Kontextoptionen

Mögliche Lösungen / Problemumgehungen

Erster Tipp: Lassen Sie den Serveradministrator seinen Server reparieren, anstatt diesen in Ihrem Client zu umgehen; -)

Vielleicht können Sie es mit der ciphers Option für SSL-Streams, um nur eine exakte TLSv1.0-Cipher-Suite zu übergeben (das ist einmalig.) zu TLSv1.0) in der Liste, die Ihr Zielserver unterstützt.

Das Umschalten der Implementierung auf cURL wird höchstwahrscheinlich auch hier nicht helfen, wie aus einem Eintrag hervorgeht in ihrer Mailing-Liste gibt es keine Möglichkeit, eine bestimmte TLS-Version zu erzwingen - der Client wird bei Bedarf automatisch herunterstufen.

tl; dr

Ich kenne derzeit keine Möglichkeit, TLSv1.0 explizit für SSL-Verbindungen von PHP zu erzwingen.

    
toubsen 19.11.2013 13:29
quelle
0

Ich kann bestätigen, dass die oben akzeptierte Antwort für Ubuntu 12.04 und PHP 5.4.33 nicht funktioniert. Ich fand auch heraus, dass ich das Zertifikat manuell angeben muss, wenn ich openssl und curl versuche, um auf HTTPS-Endpunkte zuzugreifen. Am Ende habe ich RHEL 7 und PHP 5.5 verwendet, um eine solide Lösung zu finden, als ich die Integration für eine Unternehmensanwendung entwickelte. Nichts gegen Ubuntu, aber in meinem speziellen Fall hat es nicht funktioniert.

    
Arun Vasudevan Nair 03.11.2014 03:43
quelle

Tags und Links