更新WWW :: Curl ::易于使用TLS

时间:2018-06-08 15:04:30

标签: perl libcurl tls1.2

我正在尝试更新一个简单的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 Documentation on WWW::Curl,包括WWW :: Curl :: Easy的示例,方法setopt应该采用“最多”libcurl个参数。我相信它正确地取CURLOPT_SSLVERSION,但是没有采用CURLOPT_SSLVERSION's documentation中描述的常量之一,执行此代码的程序员决定将等效值告知其中一个选项(可能是SSLv3)而不是?

所以,我不知道我应该传递给CURLOPT_SSLVERSION什么值以告知该模块使用TLS 1.2,或者如何通知正确的常量。或者是否有另一个setopt参数,我可以设置它以使用TLS 1.2?

另外,如果没有解决方法,我正在考虑在另一个库周围创建一个新功能 - 也许LWP::UserAgent?这是最好的方式吗?还有其他图书馆更适合处理这个吗?

提前感谢您的任何想法。

1 个答案:

答案 0 :(得分:2)

只需删除行设置CURLOPT_SSLVERSION!默认的libcurl会尝试协商正确的版本,因此通常不需要也不需要特定的选择。

数字3来自this list中的SSLv3(在libcurl头文件中)。第一个条目是0,第二个条目是等等。

明确地要求使用TLS 1.2(或更高版本),要使用的符号为CURL_SSLVERSION_TLSv1_2,但我建议您不要询问特定版本,只要您不必。请注意,此符号首先在libcurl 7.34.0中引入。