使用LWP :: UserAgent进行sslv3警报握手失败

时间:2017-12-02 13:34:52

标签: perl https handshake lwp-useragent sslv3

我正在尝试使用LWP::UserAgent发送https请求:

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $login_url = 'https://www.icscards.nl/abnamrogb/login/login';
my $ssl_options = { SSL_version => 'tlsv1', verify_hostname => 0 };
my $browser = LWP::UserAgent->new(ssl_opts => $ssl_options);
$browser->cookie_jar( {} );

my $response = $browser->get($login_url);
print $response->decoded_content;

并收到以下错误消息:

Can't connect to www.icscards.nl:443

LWP::Protocol::https::Socket: SSL connect attempt failed because of handshake problems error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure at /System/Library/Perl/Extras/5.18/LWP/Protocol/http.pm line 51.

将网址更改为例如https://www.google.com/工作正常,但不是我想要提取的网址。

值得注意的是:使用python向此URL发出请求时出现相同的错误。

1 个答案:

答案 0 :(得分:3)

  

...在/System/Library/Perl/Extras/5.18/LWP/Protocol/http.pm第51行警告握手失败。

看起来您正在使用MacOS和旧版本的Perl。基于此,我假设您的基础OpenSSL版本仍然是0.9.8,因为这个古老版本的OpenSSL是MacOS附带的版本。您可以通过调用

来验证我的假设
perl -MNet::SSLeay -E 'say Net::SSLeay::SSLeay_version(0)

如果报告版本0.9.8,我的假设是正确的。如果此报告1.0.0我错了,但以下仍然适用。如果它报告1.0.1甚至更好,则以下说明不适用。

OpenSSL 0.9.8不支持ECDHE密码,也可以在report from SSLLabs看到。只有,从this report by SSLLabs可以看出,此服务器需要ECDHE密码。因此,客户端和服务器之间没有通用密码,这意味着TLS握手失败。