Обновление WWW :: Curl :: Легко работать с TLS - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь обновить простую подпрограмму Perl, которая позволяет нашей программе подключаться к серверам правительства Бразилии для загрузки счетов.Сегодня он работает нормально, как показано ниже:

use WWW::Curl::Easy;
my $curl = WWW::Curl::Easy->new;
my $response_body;

my @param = ('Content-Type: application/soap+xml; charset=utf-8', "SOAPAction: '$action''");
$curl->setopt(CURLOPT_URL, "$urlsefaz"); # one of Brazil's SEFAZ URLs
$curl->setopt(CURLOPT_PORT , 443);
$curl->setopt(CURLOPT_VERBOSE, 0);
$curl->setopt(CURLOPT_HEADER, 1); 
$curl->setopt(CURLOPT_SSLVERSION, 3);
$curl->setopt(CURLOPT_SSL_VERIFYHOST, 0);
$curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
$curl->setopt(CURLOPT_SSLCERT, "$certificate");
$curl->setopt(CURLOPT_SSLKEY, "$privateKey");
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, $data);
$curl->setopt(CURLOPT_HTTPHEADER, \@param);
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

my $responsexml = $curl->perform;

Однако правительство Бразилии обновило свою политику безопасности, и при следующем обновлении они больше не будут принимать соединения SSLv3, а вместо этого принимает только TLS 1.2, что вызываетмои текущие попытки соединения с новыми тестовыми серверами завершаются неудачей.

Согласно Документации MetaCPAN для WWW :: Curl , которая включает в себя пример для WWW :: Curl :: Easy, методsetopt должен принимать "большинство" libcurl параметров.Я верю, что он принимает CURLOPT_SSLVERSION правильно, но вместо того, чтобы взять одну из констант, описанных в документации CURLOPT_SSLVERSION , программист, который сделал этот бит кода, решил сообщить эквивалентное значение одной из опций (предположительно SSLv3) вместо этого?

Итак, я понятия не имею, какое значение я должен передать CURLOPT_SSLVERSION, чтобы сообщить этому модулю о работе с TLS 1.2, или как вместо этого сообщить правильную константу.Или есть другой аргумент setopt, который я мог бы установить для его работы с TLS 1.2?

Кроме того, если нет обходного пути, я подумываю о создании новой функции с нуля вокруг другой библиотеки - возможно, LWP::UserAgent?Будет ли это лучший путь?Существуют ли другие библиотеки, более подходящие для этого?

Спасибо за любые мысли заранее.

1 Ответ

0 голосов
/ 08 июня 2018

Просто удалите настройку линии CURLOPT_SSLVERSION!Libcurl по умолчанию будет пытаться согласовать правильную версию в любом случае, поэтому конкретный выбор, как правило, не требуется и не требуется.

Число 3 взято из SSLv3 в этом списке (в заголовочном файле libcurl),Первая запись - 0, вторая - 1 и т. Д.

до явно запрос TLS 1.2 (или более поздней версии), символ для использования - CURL_SSLVERSION_TLSv1_2, но я рекомендую не запрашивать конкретные версиидо тех пор, пока ты не должен.Обратите внимание, что этот символ был впервые введен в libcurl 7.34.0.

...