it-swarm.com.ru

TLS 1.2 не работает в cURL

У меня возникают проблемы с керлингом URL-адреса HTTPS, использующего TLS1.2, в своей операции скручивания я публикую свои данные для входа на веб-сайт и сохраняю их в cookiefile .... Я получаю следующее сообщение об ошибке: 

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

Я попытался установить VERIFYPEER и VERIFYHOST в 0, но это, похоже, не работает, какие-либо предложения?

Вот версии, которые я использую:

  • OpenSSL версия 0.9.8b
  • CURL версия 7.24.0
  • PHP составляет 5,3 

Вот код:

$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

Вы должны использовать целочисленное значение для значения CURLOPT_SSLVERSION, not строку, как указано выше

Попробуй это:

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

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

значение должно быть целым числом для следующих значений параметра option: CURLOPT_SSLVERSION 

Один из

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 и TLS 1.2 поддерживаются начиная с OpenSSL 1.0.1

Принудительное использование TLS 1.1 и 1.2 поддерживается только с curl 7.34.0

Вы должны рассмотреть вопрос об обновлении.

22
umka

У меня есть похожая проблема в контексте Stripe:

Ошибка: Stripe больше не поддерживает запросы API, сделанные с TLS 1.0 . Пожалуйста, инициируйте HTTPS-соединения с TLS 1.2 или новее. Ты можешь научиться Подробнее об этом на https://stripe.com/blog/upgrading-tls .

Принудительное использование TLS 1.2 с использованием параметра CURL является временным решением или даже не может быть применено из-за недостатка места для размещения обновления. По умолчанию функция тестирования TLS https://Gist.github.com/olivierbellone/9f93efe9bd68de33e9b3a3afbd3835cf показала следующую конфигурацию:

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

Я обновил библиотеки, используя следующую команду:

yum update nss curl openssl

а потом увидел это:

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

Обратите внимание, что версия TLS по умолчанию изменена на 1.2! Это глобально решенная проблема. Это также поможет пользователям Paypal: https://www.Paypal.com/au/webapps/mpp/tls-http-upgrade (обновление до конца июня 2017 г.)

12
Tomasz Dobrzyński

Заменить следующее

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

С

curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

Должен работать без нареканий.

1
Tauseef

TLS 1.2 поддерживается только с OpenSSL 1.0.1 (см. раздел Основные выпуски версий ), вам необходимо обновить OpenSSL.

Нет необходимости устанавливать опцию CURLOPT_SSLVERSION. Запрос включает в себя рукопожатие, которое будет применять новейшую версию TLS как для поддержки сервера, так и для клиента. Запрашиваемый вами сервер использует TLS 1.2, поэтому ваш php_curl будет использовать TLS 1.2 (по умолчанию), а также, если ваша версия OpenSSL (или новее) 1.0.1.

0
shintaroid