php - cafile - TLS 1.2 no funciona en cURL
php tls (5)
Tengo problemas para curvar una url HTTPS que usa TLS1.2, en mi operación de curl publico mis datos de inicio de sesión en el sitio web y los guardo en cookiefile. El mensaje de error que recibo es este
error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
He intentado establecer
VERIFYPEER
y
VERIFYHOST
en 0 pero eso no parece funcionar, ¿alguna sugerencia?
Aquí están las versiones que estoy usando:
- La versión de OpenSSL es 0.9.8b
- La versión CURL es 7.24.0
- PHP es 5.3
Aquí está el código:
$setuplogin = curl_init();
curl_setopt ($setuploginurl, CURLOPT_URL, $url);
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt ($setuploginurl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, ''CURL_SSLVERSION_TLSv1_2'');
curl_setopt ($setuploginurl, CURLOPT_POSTFIELDS, ''username=uname&password=pword&act=login&submit=Login'');
curl_setopt ($setuploginurl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36");
curl_setopt (setuploginurl, CURLOPT_TIMEOUT, 60);
curl_setopt ($setuploginurl, CURLOPT_COOKIESESSION, TRUE);
curl_setopt ($setuploginurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($setuploginurl, CURLOPT_HEADER, 1);
curl_setopt ($setuploginurl,CURLOPT_ENCODING,"gzip");
curl_setopt ($setuploginurl, CURLOPT_POST, true);
curl_setopt ($setuploginurl, CURLOPT_COOKIEJAR, ''cookies.txt'');
curl_setopt ($setuploginurl, CURLOPT_FRESH_CONNECT , 1);
$loginp= curl_exec($setuploginurl);
if ($loginp === FALSE) {
die(curl_error($setuploginurl));
}
curl_close ($setuploginurl);
var_dump ($loginp);
Debe usar un valor entero para el valor
CURLOPT_SSLVERSION
,
no
una cadena como se enumeró anteriormente
Prueba esto:
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2
http://php.net/manual/en/function.curl-setopt.php
El valor debe ser un número entero para los siguientes valores del parámetro de opción:
CURLOPT_SSLVERSION
Uno de
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).
Reemplazar siguiente
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, ''CURL_SSLVERSION_TLSv1_2'');
Con
curl_setopt ($ch, CURLOPT_SSLVERSION, 6);
Debería funcionar a la perfección.
TLS 1.1 y TLS 1.2 son compatibles desde OpenSSL 1.0.1
Forzar TLS 1.1 y 1.2 solo son compatibles desde curl 7.34.0
Deberías considerar una actualización.
Tengo un problema similar en el contexto de Stripe:
Error: Stripe ya no admite solicitudes de API realizadas con TLS 1.0. Inicie las conexiones HTTPS con TLS 1.2 o posterior. Puede obtener más información al respecto en https://stripe.com/blog/upgrading-tls .
Forzar TLS 1.2 usando el parámetro CURL es una solución temporal o incluso no se puede aplicar debido a la falta de espacio para colocar una actualización. Por defecto, la función de prueba TLS https://gist.github.com/olivierbellone/9f93efe9bd68de33e9b3a3afbd3835cf mostró la siguiente configuración:
SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.0
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2
Actualicé las bibliotecas usando el siguiente comando:
yum update nss curl openssl
y luego vi esto:
SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2
¡Tenga en cuenta que la versión predeterminada de TLS cambió a 1.2! Ese problema globalmente resuelto. Esto también ayudará a los usuarios de PayPal: https://www.paypal.com/au/webapps/mpp/tls-http-upgrade (actualización antes de finales de junio de 2017)
TLS 1.2
solo es compatible desde
OpenSSL 1.0.1
(consulte la
sección
OpenSSL 1.0.1
principales de la versión
), debe actualizar su
OpenSSL
.
No es necesario establecer la opción
CURLOPT_SSLVERSION
.
La solicitud implica un apretón de manos que aplicará la versión más reciente de
TLS
, tanto para el servidor como para el cliente.
El servidor que solicita está usando
TLS 1.2
, por lo que su
php_curl
también usará
TLS 1.2
(por defecto) si su versión de
OpenSSL
es (o más reciente que)
1.0.1
.