perl – 如何让LWP验证SSL服务器证书?

如何获取 LWP以验证我连接的服务器的证书是否由受信任的颁发机构签发并颁发给正确的主机?据我所知,它甚至不检查证书声称是为我连接的主机名。这似乎是一个主要的安全漏洞(特别是最近的DNS漏洞)。

更新:原来我真正想要的是HTTPS_CA_DIR,因为我没有ca-bundle.crt。但HTTPS_CA_DIR = / usr / share / ca-certificates /做到了。我把答案标记为接受,因为它足够接近。

更新2:事实证明,HTTPS_CA_DIR和HTTPS_CA_FILE仅适用于如果您使用Net :: SSL作为底层SSL库。但LWP也与IO :: Socket :: SSL,它将忽略这些环境变量,并愉快地与任何服务器谈话,无论它提供什么证书。有更一般的解决方案吗?

更新3:不幸的是,解决方案仍然不完整。 Net :: SSL或IO :: Socket :: SSL都不会针对证书检查主机名。这意味着某人可以获取某些域的合法证书,然后假冒任何其他域,而无LWP抱怨。

更新4:LWP 6.00终于解决了这个问题。详情请参见my answer

解决方法

这个长期存在的安全漏洞最终在 libwww-perl的版本6.00中得到修复。从该版本开始,认情况下, LWP::UserAgent验证HTTPS服务器提供与预期主机名匹配的有效证书(除非将$ ENV {PERL_LWP_SSL_VERIFY_HOSTNAME}设置为false值, ,如果该变量未设置,则为向后兼容性,设置$ ENV {HTTPS_CA_FILE}或$ ENV {HTTPS_CA_DIR}。

这可以由LWP :: UserAgent的新的ssl_opts选项控制。有关如何查找证书颁发机构证书的详细信息,请参阅此链接。但要小心,LWP :: UserAgent的工作方式,如果你提供一个ssl_opts哈希到构造函数,那么verify_hostname认为0而不是1.(This bug在LWP 6.03中修复)为了安全,总是指定verify_hostname = > 1在您的ssl_opts。

所以使用LWP :: UserAgent 6;应足以使服务器证书验证。

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...