tls cafile php ssl openssl php-curl

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 .