升级LWP“证书验证失败”后脚本崩溃

问题描述 投票:17回答:4

我有很多脚本,其中大部分是基于WWW::Mechanize,它们可以通过HTTP访问misc硬件中的数据。升级了我的大部分perl安装及其模块后,所有使用HTTPS://的脚本因"certificate verify failed"而破坏

这是因为较新版本的LWP会对证书进行正确检查,如果某些内容不匹配,则会对dies进行正确检查。

在我的情况下,由于情况,预计失败的证书认证,所以我需要找到一种干净地绕过这种检查的方法。

perl www-mechanize lwp
4个回答
21
投票

说我想告诉你一些事情,我不想让别人知道。我们会安排一个密码,我会用它来加密邮件,然后我会给你发邮件。

如果我不确定我提供密码和加密消息的人是你,该怎么办?然后,任何数量的人都可能只是模仿你,加密将是徒劳的。直到最近,这才是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


12
投票

对我来说,使用:

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'},
);

5
投票

我在前面添加了代码:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

这导致脚本以干净简单的方式绕过检查。


4
投票

@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(大约在页面的一半)。

© www.soinside.com 2019 - 2024. All rights reserved.