使用 WWW::Mechanize 连接到 https 站点的 Perl 脚本刚刚开始失败

Perl script using WWW::Mechanize to connect to https site just started failing

我有一个使用 WWW::Mechanize 连接到网站的 Perl 脚本 https,而该脚本前几天刚刚停止工作。现状 我收到的错误消息是 500 和“无法连接到 jobs.illinois.edu:443”。我尝试连接的 URL 是 https://jobs.illinois.edu/。我可以从我的浏览器 (Firefox) 连接。 我的平台是 Linux -- 最新的 Arch Linux。我也可以连接 (使用 WWW::Mechanize)到其他 https 站点。

我试过使用 LWP::UserAgent,结果是一样的。

我正在使用 ssl_opts => { SSL_version => 'TLSv1' };我不记得为什么 我补充说——可能有必要让它在某些时候工作 点.

关于如何解决这个问题的任何想法,或者我如何获得更多信息 问题是什么?我可以尝试其他 SSL 选项吗?

我感觉 导致此问题的网站——可能是某些 SSL 协议版本 改变或类似的东西。 (我不认为我更新了任何东西 在我的机器上工作和停止工作之间。)

谢谢。

这是失败的示例代码:

#!/usr/bin/perl

use strict;
use warnings;

use constant AJB_URL => 'https://jobs.illinois.edu/academic-job-board';

use WWW::Mechanize;

my $mech = WWW::Mechanize->new( ssl_opts => { SSL_version => 'TLSv1' } );

$mech->get( AJB_URL );

它returns:

Error GETing https://jobs.illinois.edu/academic-job-board: Can't connect to jobs.illinois.edu:443 at ./test2.pl line 12.

... that script just stopped working the other day.

这在大多数情况下是由服务器端或客户端更改引起的。但我假设您没有在客户端进行任何更改。

使用 perl -MIO::Socket::SSL=debug4... 调用您的代码得到:

DEBUG: ...SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

查看 SSLLabs report 您会看到两条信任路径,其中一条需要额外下载。第一个信任路径的根 CA "USERTrust RSA Certification Authority" 没有安装在我的系统上 (Ubuntu 14.04),我猜它也没有安装在你的系统上(没有关于你的 OS 的信息是已知的,所以只是猜测)。这意味着将使用第二个信任链,并且相关的 Root-CA "AddTrust External CA Root" 也安装在我的系统上。不幸的是,此信任链缺少中间证书 ("Extra download"),因此验证失败。

要解决此问题,请找到应该与指纹 2b8f1b57330dbba2d07a6c51f70ee90ddab9ad8e 匹配的缺失根 CA 并使用它:

$ENV{PERL_LWP_SSL_CA_FILE} = '2b8f1b57330dbba2d07a6c51f70ee90ddab9ad8e.pem';

看证书是2015年5月22日签发的,也就是三天前。这就解释了刚才为什么会出现这个问题。