如何获取
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抱怨。
解决方法
这个长期存在的安全漏洞最终在
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;应足以使服务器证书验证。