我有很多脚本,其中大部分是基于WWW::Mechanize
,它们可以通过HTTP访问misc硬件中的数据。升级了我的大部分perl安装及其模块后,所有使用HTTPS://的脚本因"certificate verify failed"
而破坏
这是因为较新版本的LWP会对证书进行正确检查,如果某些内容不匹配,则会对dies
进行正确检查。
在我的情况下,由于情况,预计失败的证书认证,所以我需要找到一种干净地绕过这种检查的方法。
说我想告诉你一些事情,我不想让别人知道。我们会安排一个密码,我会用它来加密邮件,然后我会给你发邮件。
如果我不确定我提供密码和加密消息的人是你,该怎么办?然后,任何数量的人都可能只是模仿你,加密将是徒劳的。直到最近,这才是LWP的HTTPS支持状态。
现在,LWP实际上会检查它正在与谁交谈,除非你要求LWP表现得像以前一样。你可以这样做:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
如果要在脚本中影响所有LWP :: UserAgent实例而不在整个位置指定选项,可以将以下内容添加到脚本中
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
或者您可以按如下方式启动脚本:
PERL_LWP_SSL_VERIFY_HOSTNAME=0 script.pl
最后,如果您希望LWP始终不安全,可以将以下内容添加到登录脚本中:
export PERL_LWP_SSL_VERIFY_HOSTNAME=0
但是,我推荐以上都不是。更好的选择是为您要与之通信的主机提供证书。 (这相当于在Firefox中添加例外,如果你知道我的意思。)请参阅documentation获取$ua->ssl_opts
。
对我来说,使用:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
墓内
不建议使用客户端SSL_VERIFY_NONE的默认SSL_verify_mode!请将SSL_verify_mode与SSL_ca_file | SSL_ca_path一起设置为SSL_VERIFY_PEER以进行验证。如果您确实不想验证证书并保持连接对Man-In-The-Middle攻击开放,请在应用程序中将SSL_verify_mode明确设置为SSL_VERIFY_NONE。
使用这个没有给出任何警告:
my $ua = LWP::UserAgent->new(
ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);
我在前面添加了代码:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
这导致脚本以干净简单的方式绕过检查。
@ikegami为您不希望禁用SSL主机名验证的原因提出了一个很好的论据,但没有直接提及如何避免它。
如果您正在与具有CA签名证书的公共系统进行通信,则需要将LWP指向您的分发的根证书集合。在基于Debian的系统(Ubuntu等)下,它保存在/etc/ssl/certs/
下。
BEGIN {
$ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}
如果您使用自签名证书与自己的服务器通信,则可以在客户端上保存该证书的副本,并将脚本指向该特定文件。
BEGIN {
$ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}
您可以在运行脚本之前在环境中设置它们(例如,从shell导出它们),或者可以将设置直接应用于UserAgent对象。有关详细信息,请参阅LWP::UserAgent documentation;搜索ssl_opts
(大约在页面的一半)。