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

时间:2015-05-25 05:01:00

标签: perl www-mechanize

我有一个Perl脚本,它使用WWW :: Mechanize连接到一个站点 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 );

它返回:

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

1 个答案:

答案 0 :(得分:6)

  

...那个剧本前几天停止了工作。

在大多数情况下,这是由服务器端或客户端更改引起的。但我认为你没有在客户端做任何改变。

使用perl -MIO::Socket::SSL=debug4...调用您的代码会产生:

DEBUG: ...SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

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

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

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

查看证书,您会看到它是在2015年5月22日(即三天前)发布的。这解释了为什么问题刚才发生。