使用 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日签发的,也就是三天前。这就解释了刚才为什么会出现这个问题。
我有一个使用 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日签发的,也就是三天前。这就解释了刚才为什么会出现这个问题。