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

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

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

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

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

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

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

значение должно быть целым числом для следующих значений параметра параметра: 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).

TLS 1.1 и TLS 1.2 поддерживаются с OpenSSL 1.0.1

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

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

У меня есть аналогичная проблема в контексте 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 года)

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

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

С

 curl_setopt ($ch, CURLOPT_SSLVERSION, 6); 

Должен работать безупречно.