PHP Curl(con NSS) probablemente esté usando SSLv3 en lugar de TLS cuando se conecta a https
(4)
Ese es un problema interesante.
Si consulta SSLLabs para este sitio, verá que solo es compatible con varias cifras ECDHE-ECDSA- * y ningún otro sistema de cifrado. Pero, en el historial de versiones de curl , encontrará un error con los sistemas de cifrado ECC y la biblioteca NSS (que usa) que solo está corregido en la versión curl 7.36 "nss: permita usar cifras ECC si NSS las implementa" .
Como está utilizando Curl 7.19.7, su curvatura es demasiado antigua para usar las cifras necesarias junto con la biblioteca NSS. Esto significa que necesita actualizar su biblioteca Curl.
Estoy usando la biblioteca curl (con NSS) en PHP para conectarme a mi otro servidor. Todo estuvo bien hasta la semana pasada, cuando el servidor de destino dejó de soportar SSLv3 debido a la vulnerabilidad poodle (CloudFlare por cierto). Ahora, intento hacer la conexión usando TLS, pero sigo recibiendo un "error de conexión SSL".
Hay un código de muestra, estoy usando:
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_URL => ''https://www.lumiart.cz'',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSLVERSION => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => true
) );
$output = curl_exec( $ch );
echo $output;
print_r( curl_getinfo( $ch ) );
echo ''error:'' . curl_error( $ch );
curl_close($ch);
Según tengo entendido, establecer CURLOPT_SSLVERSION
en 1
debe forzar la conexión a través de TLS.
Nota: Tengo CURLOPT_SSL_VERIFYPEER => false
solo para la depuración y no quiero dejarlo ahí, una vez que resuelvo este problema.
Esto es resultado:
Array
(
[url] => https://www.lumiart.cz
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 2.3E-5
[connect_time] => 0.005777
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => 2400:cb00:2048:1::681c:86f
[redirect_url] =>
)
error:SSL connect error
Tengo todo esto en el proveedor de alojamiento compartido, por lo que no puedo cambiar ninguna configuración de php.ini ni actualizar ningún componente. Todo lo que tengo es phpinfo (). Revisé el soporte de TLS en la versión de estos componentes y debería estar bien. Aquí hay un extracto de phpinfo:
PHP Version 5.4.32
System Linux wl42-f262 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64
curl:
cURL support enabled
cURL Information 7.19.7
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate Yes
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp
Host x86_64-redhat-linux-gnu
SSL Version NSS/3.15.3
ZLib Version 1.2.3
libSSH Version libssh2/1.4.2
Creo que ese problema es el uso de SSLv3 en lugar de TLS, pero no estoy 100% seguro. Todo lo que estoy tratando es "Error de conexión SSL" y no sé cómo averiguar qué versión de SSL se utilizó para conectar.
¿Hay alguna manera, cómo comprobar, qué versión SSL se utiliza para la conexión? ¿O me estoy perdiendo algo?
Gracias por cualquier consejo!
Tengo Curl 7.21.7 y PHP 5.4.34, y esto pareció ser el truco para mí:
curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
Obtenga más información aquí , aunque no dice cuándo se introdujo CURL_SSLVERSION_TLSv1.
La respuesta para mí fue usar un valor entero en lugar de una cadena ... es decir: Cambiar:
curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2);
A:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
O para tlsv1_1:
curl_setopt($ch, CURLOPT_SSLVERSION, 5);
Aquí está la lista completa:
CURL_SSLVERSION_DEFAULT (0)
CURL_SSLVERSION_TLSv1 (1)
CURL_SSLVERSION_SSLv2 (2)
CURL_SSLVERSION_SSLv3 (3)
CURL_SSLVERSION_TLSv1_0 (4)
CURL_SSLVERSION_TLSv1_1 (5)
CURL_SSLVERSION_TLSv1_2 (6)
Estoy ejecutando lo siguiente por cierto:
curl-7.19.7-46.el6.x86_64
nss-3.21.0-0.3.el6_7.x86_64
Error duplicado de SSL de respuesta no puede cambiar a TLS propuesto:
Intente agregar CURLOPT_SSL_CIPHER_LIST => ''TLSv1'' a su PPHttpConfig.php.
(y discutido aquí Actualizar la solicitud PHP cURL de SSLv3 a TLS ... también).
Como se comentó de manera útil, esto se aplica a la biblioteca de curl de openssl , no a nss .