我有很多脚本,其中大部分基于WWW::Mechanize
,可以从可通过HTTP访问的misc硬件中删除数据。升级我的大多数perl安装及其模块后,所有使用HTTPS://的脚本因"certificate verify failed"
这是因为较新版本的LWP会对证书进行正确检查,dies
如果某些内容不匹配,则会这样做。
在我的情况下,由于情况的原因,预计会失败的证书认证,所以我需要找到一种干净地绕过这种检查的方法。
答案 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
(大约在页面的中间位置)。