web-dev-qa-db-fra.com

TLS 1.2 ne fonctionne pas dans cURL

Je ne parviens pas à créer une URL HTTPS utilisant TLS1.2; lors de mon opération curl, je publie mes informations de connexion sur le site Web et les enregistre dans le fichier cookiefile . Le message d'erreur que je reçois est le suivant. 

 error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error

J'ai essayé de mettre VERIFYPEER et VERIFYHOST à 0 mais cela ne semble pas fonctionner, des suggestions?

Voici les versions que j'utilise:

  • La version d'OpenSSL est 0.9.8b
  • La version de CURL est 7.24.0
  • PHP est 5.3 

Voici le code:

$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);
21
Sam Ash

Vous devez utiliser une valeur entière pour la valeur CURLOPT_SSLVERSION, pas une chaîne comme indiqué ci-dessus

Essaye ça:

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2

http://php.net/manual/en/function.curl-setopt.php

valeur doit être un entier pour les valeurs suivantes du paramètre option: CURLOPT_SSLVERSION 

Un des

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). 

47
Jeff

TLS 1.1 et TLS 1.2 sont pris en charge depuis OpenSSL 1.0.1

Forcer TLS 1.1 et 1.2 n'est pris en charge que depuis curl 7.34.0

Vous devriez envisager une mise à niveau.

22
umka

J'ai un problème similaire dans le contexte de Stripe:

Erreur: Stripe ne prend plus en charge les requêtes API effectuées avec TLS 1.0 . Veuillez établir des connexions HTTPS avec TLS 1.2 ou une version ultérieure. Tu peux apprendre plus à ce sujet à https://stripe.com/blog/upgrading-tls .

Forcer TLS 1.2 à l'aide du paramètre CURL est une solution temporaire, voire impossible à appliquer faute de place pour mettre à jour une mise à jour. Par défaut, la fonction de test TLS https://Gist.github.com/olivierbellone/9f93efe9bd68de33e9b3a3afbd3835cf a présenté la configuration suivante:

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

J'ai mis à jour les bibliothèques en utilisant la commande suivante:

yum update nss curl openssl

et ensuite vu ceci:

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

Veuillez noter que la version par défaut de TLS a été remplacée par la version 1.2! Ce problème globalement résolu. Cela aidera également les utilisateurs de Paypal: https://www.Paypal.com/au/webapps/mpp/tls-http-upgrade (mise à jour avant la fin juin 2017)

12

Remplacer suivant

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');

Avec

curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

Devrait fonctionner parfaitement.

1
Tauseef

TLS 1.2 n’est pris en charge que depuis OpenSSL 1.0.1 (voir la section Major versions release ), vous devez mettre à jour votre OpenSSL.

Il n'est pas nécessaire de définir l'option CURLOPT_SSLVERSION. La demande implique une poignée de main qui appliquera la version la plus récente de TLS aux supports serveur et client. Le serveur que vous demandez utilise TLS 1.2, votre php_curl utilisera donc TLS 1.2 (par défaut) également si votre version OpenSSL est (ou plus récente que) 1.0.1.

0
shintaroid