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

Jar*_*und 18 perl www-mechanize lwp

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

这是因为较新版本的LWP对证书进行了适当的检查以及 dies是否存在不匹配的事实.

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

ike*_*ami 21

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

如果我不确定我提供密码和加密消息的人是你,该怎么办?然后,任何数量的人都可能只是模仿你,加密将是徒劳的.直到最近,这才是LWP的HTTPS支持状态.

现在,LWP实际上会检查它正在与谁交谈,除非你要求LWP表现得像以前一样.你可以这样做:

my $ua = LWP::UserAgent->new(
   ssl_opts => { verify_hostname => 0 },
);
Run Code Online (Sandbox Code Playgroud)

如果要在脚本中影响所有LWP :: UserAgent实例而不在整个位置指定选项,可以将以下内容添加到脚本中

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
Run Code Online (Sandbox Code Playgroud)

或者您可以按如下方式启动脚本:

PERL_LWP_SSL_VERIFY_HOSTNAME=0 script.pl
Run Code Online (Sandbox Code Playgroud)

最后,如果您希望LWP始终不安全,可以将以下内容添加到登录脚本中:

export PERL_LWP_SSL_VERIFY_HOSTNAME=0
Run Code Online (Sandbox Code Playgroud)

但是,我推荐以上都不是.更好的选择是为您要与之通信的主机提供证书.(这是在Firefox中添加一个例外,如果你知道我的意思是等价的.)请参阅文档$ua->ssl_opts.


小智 12

对我来说,使用:

my $ua = LWP::UserAgent->new(
  ssl_opts => { verify_hostname => 0 },
);
Run Code Online (Sandbox Code Playgroud)

墓内

不建议使用客户端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'},
);
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要有 `use IO::Socket::SSL;` 并省略引号 -- IE, `{ SSL_verify_mode => SSL_VERIFY_NONE }` (2认同)
  • 不要用这个。`SSL_verify_mode` 不需要字符串。`SSL_verify_mode => 'SSL_VERIFY_NONE'` 可能被视为 `SSL_verify_mode => 0` (2认同)

Jar*_*und 5

我在代码之前加上了:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
Run Code Online (Sandbox Code Playgroud)

这导致脚本以简洁明了的方式规避了检查。


Jan*_*der 5

@ikegami 很好地说明了为什么您不想禁用 SSL 主机名验证,但没有直接提及如何避免它。

如果您正在与具有 CA 签名证书的公共系统对话,则需要将 LWP 指向您的发行版的根证书集合。在基于 Debian 的系统(Ubuntu 等)下,它保存在/etc/ssl/certs/.

BEGIN {
    $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}
Run Code Online (Sandbox Code Playgroud)

如果您使用自签名证书与您自己的服务器通信,您可以在客户端上保存该证书的副本,并将您的脚本指向该特定文件。

BEGIN {
    $ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}
Run Code Online (Sandbox Code Playgroud)

您可以改为在运行脚本之前在环境中设置这些(例如,从您的 shell 导出它们),或者您可以将设置直接应用到您的 UserAgent 对象。有关更多详细信息,请参阅LWP::UserAgent 文档;搜索ssl_opts(大约在页面的中间)。