2015-05-09 3 views
16

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

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

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

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

  • OpenSSL версии 0.9.8b
  • CURL версия 7.24.0
  • РНР 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); 
+2

Вы должны использовать 2 для CURLOPT_SSL_VERIFYHOST, а не 1. – Bruno

+0

Я не знаю, является ли это автоматическим, но переход на PHP v 5.6.33 решил мою проблему , –

ответ

15

TLS 1.1 и TLS 1.2 являются supp orted так OpenSSL 1.0.1

Форсаж TLS 1.1 и 1.2 поддерживаются только начиная с curl 7.34.0

Вы должны рассмотреть модернизацию.

+0

Curl также добавляется только к TLS 1.2 в версии [7.34.0] (http://curl.haxx.se/docs/manpage.html#--tlsv12) – Hannele

+0

Обновление до OpenSSL 1.0.1 разрешило аналогичную проблему для меня , – OfficeAddinDev

+1

Если бы yum update nss openssl завивал, чтобы заставить его работать на Centos 6.4. –

35

Вы должны использовать целочисленное значение для значения 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).

+3

вы все равно можете использовать 'CURL_SSLVERSION_TLSv1_2' - просто нужно быть константой, т. Е. Не в кавычках. 'curl_setopt ($ setuploginurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);' работает для меня. – billynoah

+0

CURL_SSLVERSION_TLSv1_2 это доступно на php 5.5.19, в php 5.3 оно не работает. –

3

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

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

С

curl_setopt ($ch, CURLOPT_SSLVERSION, 6); 

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

5

Я есть аналогичные проблемы в контексте Stripe:

Error: Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at 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 

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

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 года)