
Ich habe 2 identische Ubuntu 12.04-Server hinter Amazon ELBs. Ein Server kann eine Verbindung mit TLS v1.2 herstellen, während der andere Server keine Curl-Anfrage mit TLS v1.2 stellen kann.
Unten ist der Code, den ich zur Überprüfung der Konnektivität und Versionen verwendet habe. Eine einfache Curl-Anfrage anhttps://www.howsmyssl.com/a/checkSite, die die verfügbaren Cipher Suites und TLS-Versionen zurückgibt mitphp test_curl.php
<?php
function get_tls_version($sslversion = null)
{
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.howsmyssl.com/a/check");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
if ($sslversion !== null) {
curl_setopt($c, CURLOPT_SSLVERSION, $sslversion);
}
$rbody = curl_exec($c);
if ($rbody === false) {
$errno = curl_errno($c);
$msg = curl_error($c);
curl_close($c);
return "Error! errno = " . $errno . ", msg = " . $msg;
} else {
$r = json_decode($rbody);
curl_close($c);
return $r->tls_version;
}
}
echo "OS: " . PHP_OS . "\n";
echo "uname: " . php_uname() . "\n";
echo "PHP version: " . phpversion() . "\n";
$curl_version = curl_version();
echo "curl version: " . $curl_version["version"] . "\n";
echo "SSL version: " . $curl_version["ssl_version"] . "\n";
echo "SSL version number: " . $curl_version["ssl_version_number"] . "\n";
echo "OPENSSL_VERSION_NUMBER: " . dechex(OPENSSL_VERSION_NUMBER) . "\n";
echo "TLS test (default): " . get_tls_version() . "\n";
echo "TLS test (TLS_v1): " . get_tls_version(1) . "\n";
echo "TLS test (TLS_v1_2): " . get_tls_version(6) . "\n";
?>
2 Server geben die folgenden Antworten;
Server 1
OS: Linux
uname: Linux www-leapset-us-west-1b-n1-new 3.2.0-31-virtual #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012 x86_64
PHP version: 5.3.10-1ubuntu3.4
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f
TLS test (default): TLS 1.1
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.1
Server 2
OS: Linux
uname: Linux stag-order-ec1.leapset.com 3.2.0-40-virtual #64-Ubuntu SMP Mon Mar 25 21:42:18 UTC 2013 x86_64
PHP version: 5.3.10-1ubuntu3.11
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f
TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.2
Außerdem habe ich eine Docker-Instanz mit Ubuntu 12.04 erstellt, die mit den Servern identisch ist, und die angegebene Datei ausgeführt. php curl_test.php
Sie verhielt sich auch auf die gleiche Weise wieServer 2
Darüber hinaus gibt curl --version auf 2 Servern die folgende Ausgabe auf den 2 Servern aus und sie haben die gleichen Versionen und sie passen zusammen
Server 1 und Server 2 beide
curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
Außerdem ist der Befehl: Die OpenSSL-Version ist auf beiden Servern gleich. Server 1 und Server 2 beide
OpenSSL 1.0.1 14 Mar 2012
Die in ELBs aktivierten Sicherheitsrichtlinien sind dieselben wie hier beschrieben.https://aws.amazon.com/about-aws/whats-new/2017/02/elastic-load-balancing-support-for-tls-1-1-and-tls-1-2-pre-defined-security-policies/Es handelt sich um die Standardkonfiguration ELBSecurityPolicy-2016-08, die den bereits vorhandenen Standardeinstellungen entspricht und TLS Version 1.0 und höher unterstützt.
Außerdem habe ich herausgefunden, dass curl zur Handhabung von TLS OpenSSL verwendet. Daher habe ich die OpenSSL-Konnektivität mit TLS v1.2 überprüft.
Auf dem Server 1; wenn der folgende Befehl verwendet wird, um die OpenSSL-Konnektivität zu überprüfen
openssl s_client -connect google.com:443
Die Verbindung wird über TLS v1.1 hergestellt. Wenn ich jedoch TLS v1.2 erzwinge,openssl s_client -connect google.com:443 -tls1_2
Es kann eine Verbindung zu google.com:443 über TLS v1.2 herstellen und verwendetECDHE-RSA-AES256-GCM-SHA384Verschlüsselungsschema für die Konnektivität.
Dann habe ich es versucht;openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443
und esauf Server 1 fehlgeschlagenaber arbeitete in Server 2
Außerdem openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443 -tls1_2
funktioniert es auf Server 1 einwandfrei und verbindet sich mitECDHE-RSA-AES256-GCM-SHA384Verschlüsselungsschema.
Ich bin mir nicht sicher, warumServer 1kann in Curl-Anfragen keine Verbindung mit TLS v1.2 herstellen und ich kann die OpenSSL-Version oder Curl-Version nicht aktualisieren, da Server 1 ein Produktionsserver ist.
Weiter,
Ich habe /etc/ssl/openssl.cnf und /usr/lib/ssl/openssl.cnf auf beiden Servern überprüft und sie sind auch identisch.
Jede Hilfe zum Debuggen oder Aktivieren/Erzwingen von TLS 1.2 auf Server 1 wird sehr geschätzt.