【问题标题】:sslv3 alert handshake failure with LWP::UserAgent使用 LWP::UserAgent 的 sslv3 警报握手失败
【发布时间】:2018-05-16 10:44:53
【问题描述】:

我正在尝试使用 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.

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

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

【问题讨论】:

  • 您的代码片段可以正常工作并打印页面内容而没有任何错误。使用:macOS Sierra, (darwin 16.7), LWP::UserAgent: 6.26, Mozilla::CA: 20160104, IO::Socket::SSL: 2.052
  • 也有 lwp https 问题并永久切换到 mojo::useragent。 RIP LWP。 \o/

标签: perl https handshake lwp-useragent sslv3


【解决方案1】:

...在 /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 中看到。只是,此服务器需要 ECDHE 密码,从 this report by SSLLabs 可以看出。因此,客户端和服务器之间没有通用密码,这意味着 TLS 握手失败。

【讨论】:

  • 谢谢,你说得对,我有 OpenSSL 0.9.8zg。关于如何升级它或使 perl / python 使用更新版本的任何提示?
  • @JureMerhar:网上有一些关于如何使用自制软件安装新的 OpenSSL 以及如何使用此 OpenSSL 创建 Python 安装的信息。对于 Perl,您只需要使用这个新的 OpenSSL 重建 Net::SSLeay,而不是重建所有 Perl,但网上也有关于此的说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2016-10-10
  • 1970-01-01
  • 2016-07-03
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多