
Tengo 2 servidores ubuntu 12.04 idénticos detrás de los ELB de Amazon. Un servidor puede conectarse usando TLS v1.2 mientras que el otro servidor no puede realizar una solicitud curl usando TLS v1.2
A continuación se muestra el código que he utilizado para verificar la conectividad y las versiones. Una simple solicitud curl parahttps://www.howsmyssl.com/a/checksitio que devuelve los conjuntos de cifrado disponibles y tls_version usandophp 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 servidores dan las siguientes respuestas;
servidor 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
servidor 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
Además, generé una instancia de Docker con ubuntu 12.04 idéntica a los servidores y ejecuté el archivo dado usando php curl_test.php
y también se comportó de la misma manera queservidor 2
Además, curl --version en 2 servidores proporciona el siguiente resultado en los 2 servidores y tienen las mismas versiones y coinciden
servidor 1 y servidor 2 ambos
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
También comando: la versión de openssl en ambos servidores es la misma. servidor 1 y servidor 2 ambos
OpenSSL 1.0.1 14 Mar 2012
La política de seguridad habilitada en los ELB es la misma que se describe aquíhttps://aws.amazon.com/about-aws/whats-new/2017/02/elastic-load-balancing-support-for-tls-1-1-and-tls-1-2-pre-definido- políticas-de-seguridad/son la configuración predeterminada ELBSecurityPolicy-2016-08 que corresponde a la configuración predeterminada preexistente y admite TLS versión 1.0 y superior.
Además, descubrí que curl usa openssl subyacente para manejar TLS. Por lo tanto, verifiqué la conectividad de openssl usando TLS v1.2.
En el servidor 1; cuando se usa el siguiente comando para verificar la conectividad de openssl
openssl s_client -connect google.com:443
se conecta usando TLS v1.1 Sin embargo, cuando fuerzo TLS v1.2 usandoopenssl s_client -connect google.com:443 -tls1_2
es capaz de conectarse a google.com:443 usando TLS v1.2 y usaECDHE-RSA-AES256-GCM-SHA384esquema de cifrado para la conectividad.
Entonces lo intenté;openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443
y esofalló en el servidor 1pero funcionó en el servidor 2
Más; openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443 -tls1_2
funciona bien en el servidor 1 y se conecta usandoECDHE-RSA-AES256-GCM-SHA384esquema de cifrado.
No estoy seguro de por quéservidor 1no puedo conectarme usando TLS v1.2 en solicitudes curl y no estoy en condiciones de actualizar la versión de openssl o curl porque el servidor 1 es un servidor de producción.
Más,
Revisé /etc/ssl/openssl.cnf y /usr/lib/ssl/openssl.cnf en ambos servidores y también son idénticos.
Se agradece mucho cualquier ayuda para depurar o habilitar/forzar tls 1.2 en el servidor 1.