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

使用WWW::Mechanize连接到https站点的Perl脚本刚刚开始失败,perl,www-mechanize,Perl,Www Mechanize,我有一个Perl脚本,它使用WWW::Mechanize通过 https,而该脚本前几天刚刚停止工作。地位 我收到的错误信息是500和“无法连接到” 乔布斯,伊利诺伊州,教育部:443“。我尝试连接的URL为 . 我可以从我的浏览器(Firefox)连接。 我的平台是Linux——最新的Arch Linux。我也可以连接 (使用WWW::Mechanize)连接到其他https站点 我尝试使用LWP::UserAgent,其行为是相同的 我正在使用ssl_opts=>{ssl_version=

我有一个Perl脚本,它使用WWW::Mechanize通过 https,而该脚本前几天刚刚停止工作。地位 我收到的错误信息是500和“无法连接到” 乔布斯,伊利诺伊州,教育部:443“。我尝试连接的URL为 . 我可以从我的浏览器(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.
。。。那剧本前几天刚停止工作

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

使用
perl-MIO::Socket::SSL=debug4…
调用代码会给出:

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

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

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

查看该证书,您可以看到该证书是在2015年5月22日,即三天前签发的。这就解释了刚才出现问题的原因。

,这意味着由于某种原因它无法验证证书。此外,证书FF使用仅在几天前生效(2015-05-22T0:00:00Z),因此在其一端发生了一些变化。以呈现HTTPS为代价禁用证书验证“有效”useless@ikegami:我在我的系统上从pastebin尝试了你的代码,但没有失败。显然我的问题有点不同。我确实通过添加$ENV{PERL\u LWP\u SSL\u VERIFY\u HOSTNAME}=0;实现了一些功能;。这是禁用所有证书验证,还是仅禁用其中一部分?这取决于所使用的LWP版本。它应该只从名称中禁用主机名验证,但实际上在您的系统上禁用完全验证。即使只是禁用主机名验证也会导致与完全禁用验证相同的攻击,因为中间的人可以使用任何由可信CA签名的证书,也就是他自己域的证书。好的,谢谢。这基本上是有道理的,但事情仍然不太清楚。首先,我的系统确实有这两个根CA证书(在/etc/ssl/certs中)。(我的系统是Arch Linux,几天前是最新的——我在我的原始帖子中确实提到了这一点。)其次,我尝试添加指定PERL_LWP_SSL_CA_文件的那一行,但没有任何帮助(它说“SSL_CA_文件……不存在”)。第三,我发现只添加了这一行就可以了:$ENV{PERL\u LWP\u SSL\u VERIFY\u HOSTNAME}=0;。那么,这样做安全吗?有更好的解决办法吗?谢谢。首先,禁用验证是不安全的,除非您将https作为必须解决的问题,而不是安全特性。接下来,LWP::UserAgent(WWW::Mechanize的超类)使用Mozilla::CA作为CA存储,除非您在Debian/Ubuntu上,他们在那里修补它以使用系统CA存储。最后,您可能给了PERL_LWP_SSL_CA_文件错误的路径,因此它抱怨该文件不存在。我的设置只是一个例子,我不知道你自己把文件放在哪里,仍将使用加密,但您不检查与您交谈的人,因此在告诉攻击者如何解码您的加密后,您可能会将您的信息发送给攻击者。啊,好的。我想我现在明白了。我添加了行
$ENV{PERL_LWP_SSL_CA_PATH}='/etc/SSL/certs'(并删除了行设置PERL\u LWP\u SSL\u VERIFY\u HOSTNAME),脚本就可以工作了。我想在某个时候Mozilla::CA将被更新,这将消除对这一行的需求。谢谢。是的,当Mozilla::CA因为所有丢失的1024位证书而更新时,您将遇到其他问题,请参阅