Überprüfen Sie, ob curl TLS verwendet

Lesezeit: 4 Minuten

In meiner PHP-App verwende ich CURL und openssl von PHP, um eine Verbindung herzustellen und über SOAP zu sprechen. Bisher unterstützte der Remote-Server SSL und TLS, aber wegen des „Pudel“-Fehlers entschied sich der Administrator, SSL zu deaktivieren und nur TLS zu verwenden. SSL wird bis Ende Januar unterstützt.

Ich habe meinen Code geändert, indem ich hinzugefügt habe:

curl_setopt($objCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

Das sollte Curl theoretisch dazu zwingen, TLSv1.2 zu verwenden.

Aber das ist Theorie – ich muss überprüfen, ob es tatsächlich TLS verwendet – gibt es dafür eine Methode? Es gibt eine Methode namens curl_getinfo(), aber die zurückgegebenen Informationen sind für mich nicht nützlich:

[url] => https://www.example.com/soap/MessagingPort
[content_type] => text/xml;charset=utf-8
[http_code] => 200
[header_size] => 293
[request_size] => 882
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.164487
[namelookup_time] => 3.4E-5
[connect_time] => 3.4E-5
[pretransfer_time] => 0.000122
[size_upload] => 604
[size_download] => 178
[speed_download] => 1082
[speed_upload] => 3672
[download_content_length] => 178
[upload_content_length] => 604
[starttransfer_time] => 0.164477
[redirect_time] => 0

Vielen Dank im Voraus

  • Sie können den Handshake mit einer Art Netzwerk-Sniffer untersuchen oder, wenn möglich, SSL und TLS 1.0 und 1.1 auf dem Server deaktivieren, damit es funktioniert hat um sich mit TLS 1.2 zu verbinden.

    – vcsjones

    12. Januar 2015 um 15:00 Uhr


  • Das Skript funktioniert auf einem Shared Hosting, daher gibt es keine Möglichkeit, es zu erschnüffeln. Ich habe Apache bereits auf meinem Entwicklungsserver gezwungen, TLS zu verwenden, und es funktioniert, aber ich habe keine Möglichkeit, es in der Produktion zu überprüfen. Nach ein paar Jahren der Verwendung von PHP fängt man an, nicht mehr alles als selbstverständlich zu betrachten. Ich brauche noch eine Möglichkeit, um “Sie verwenden TLS” auf dem Bildschirm anzuzeigen. Ich hatte auch ein Problem auf meinem Debian mit CURL_SSLVERSION_TLSv1_2, das nicht definiert war, und musste die Zeile ändern in: curl_setopt($objCurl, CURLOPT_SSLVERSION, 6);

    – Kayo

    13. Januar 2015 um 8:43 Uhr


Benutzer-Avatar
Jeff Richards

Kurze Antwort

Stellen Sie eine Anfrage mit curl an https://www.howsmyssl.com/

<?php 
$ch = curl_init('https://www.howsmyssl.com/a/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

$json = json_decode($data);
echo $json->tls_version;

das sollte ausgeben, welche TLS-Version für die Verbindung verwendet wurde.

Tiefer Graben

Curl verlässt sich auf die zugrunde liegende OpenSSL- (oder NSS-) Bibliothek, um die Aushandlung der sicheren Verbindung durchzuführen. Daher glaube ich, dass die richtige Frage hier lautet, wozu die OpenSSL-Bibliothek in der Lage ist. Wenn es eine TLS-Verbindung verarbeiten kann, kann curl eine TLS-Verbindung verarbeiten.

Wie kann man also herausfinden, wozu die openssl- (oder NSS-) Bibliothek in der Lage ist?

<?php    
$curl_info = curl_version();
echo $curl_info['ssl_version'];

die so etwas wie ausgeben wird

OpenSSL/1.0.1k

Dann können Sie sich die Versionshinweise für diese Version ansehen und sehen, ob sie TLS-Unterstützung enthält.

OpenSSL-Versionshinweise – https://www.openssl.org/news/changelog.html

NSS-Versionshinweise – https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_Releases

Spoiler Alarm

  • openssl enthält Unterstützung für TLS v1.1 und TLS v1.2 in OpenSSL 1.0.1
    [14 Mar 2012]
  • NSS beinhaltete Unterstützung für TLS v1.1 in 3.14
  • NSS beinhaltete Unterstützung für TLS v1.2 in 3.15

  • Ich habe den curl zu howsmyssl gemacht und es kehrt zurück error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version. Es lehnt SSL v2/3 ab? twitter.com/jmhodges/status/420614636606468096. Was mache ich in diesem Fall?

    – meder omuraliev

    29. April 2016 um 18:13 Uhr


  • Mit der zweiten PHP-Logik zeigt mein Server „NSS/3.19.1 Basic ECC“ an, was Unterstützung für TLS v1.2 impliziert, aber die erste PHP-Logik gab „TLS 1.0“ zurück? Was muss ich tun, um TLS 1.2 zu unterstützen?

    – Panofisch

    1. Juni 2016 um 19:45 Uhr

  • Vergessen Sie meinen vorherigen Kommentar … Ich habe einfach den folgenden Code in die PHP-Logik Nr. 1 eingefügt und jetzt bekomme ich TLS 1.2 curl_setopt($ch, CURLOPT_SSLVERSION, 6);

    – Panofisch

    1. Juni 2016 um 19:53 Uhr


  • Es kann erforderlich sein, hinzuzufügen curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem'); Siehe http://stackoverflow.com/questions/9774349/…

    – Amit Garg

    17. Februar 2017 um 9:01 Uhr

  • Ich habe einen solchen Fehler erhalten: SSL certificate problem: unable to get local issuer certificate. Dies wurde (vorübergehend) von behoben curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    – Andron

    13. Juni 2017 um 8:45 Uhr

Verwenden https://tlstest.paypal.com:

Zum Beispiel:

$ curl https://tlstest.paypal.com/
ERROR! Connection is using TLS version lesser than 1.2. Please use TLS1.2

$ ./src/curl https://tlstest.paypal.com/
PayPal_Connection_OK

Wenn Sie testen möchten, welches Protokoll für eine bestimmte URL (z. B. einen Zahlungs-API-Endpunkt) verwendet wird, können Sie die ausführliche Ausgabe von curl protokollieren und dort anzeigen. Hier ist ein kurzes Beispiel:

$url="https://example.com/";
$ch  = curl_init($url);
$out = fopen('php://temp', 'w+');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $out);
curl_exec($ch);
curl_close($ch);
rewind($out);

$debug = stream_get_contents($out);

if (preg_match('/SSL connection.*/', $debug, $match)) {
    echo '<pre>' . $url . PHP_EOL . $match[0];
}

Für mich gibt das eine Ausgabe wie:

https://example.com/
SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384

1300660cookie-checkÜberprüfen Sie, ob curl TLS verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy