我有一个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.
答案 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日(即三天前)发布的。这解释了为什么问题刚才发生。