3

我正在尝试使用以下命令发出 https 请求LWP::UserAgent

#!/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.

将 URL 更改为 eghttps://www.google.com/可以正常工作,但不是我想要获取的 URL。

值得注意的是:当我用 python 向这个 URL 发出请求时,我得到了同样的错误。

4

1 回答 1

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 甚至更好,则以下解释不适用。

从 SSLLabs的报告中也可以看出,OpenSSL 0.9.8 不支持 ECDHE 密码。只是,从SSLLabs 的这份报告中可以看出,此服务器需要 ECDHE 密码。因此,客户端和服务器之间没有通用密码,这意味着 TLS 握手失败。

于 2017-12-02T19:16:19.877 回答