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

时间:2012-11-14 19:24:29

标签: perl www-mechanize lwp

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

而崩溃

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

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

4 个答案:

答案 0 :(得分: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中添加例外,如果您知道我的意思。)请参阅$ua->ssl_opts {{1}}。

答案 1 :(得分:12)

对我来说,使用:

my $ua = LWP::UserAgent->new(
  ssl_opts => { verify_hostname => 0 },
);

墓内

  

对客户端使用SSL_VERIFY_NONE的默认SSL_verify_mode是   弃用!请将SSL_verify_mode一起设置为SSL_VERIFY_PEER   使用SSL_ca_file | SSL_ca_path进行验证。如果你真的没有   想要验证证书并保持连接打开   Man-In-The-Middle攻击请将SSL_verify_mode明确设置为   您的应用程序中的SSL_VERIFY_NONE。

使用此功能未发出任何警告:

my $ua = LWP::UserAgent->new(
  ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);

答案 2 :(得分:4)

我在代码前加上:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

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

答案 3 :(得分: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(大约在页面的中间位置)。