我正在尝试使用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发出请求时出现相同的错误。
答案 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握手失败。