gpt4 book ai didi

perl - WWW::Mechanize SSL 连接尝试因 https get 失败

转载 作者:行者123 更新时间:2023-12-02 18:20:49 28 4
gpt4 key购买 nike

我尝试使用 WWW::Mechanize 检索网页,但由于 SSL 连接错误而失败。我该如何解决这个问题?我在 Windows 10 x64 上运行 ActivePerl 5.20.2。

这是我执行的脚本:

perl -MIO::Socket::SSL=debug4 -MWWW::Mechanize -e 'WWW::Mechanize->new()->get("https://fundresearch.fidelity.com/mutual-funds/fees-and-prices/316343201")'

输出如下:

DEBUG: .../IO/Socket/SSL.pm:2649: new ctx 98842176
DEBUG: .../IO/Socket/SSL.pm:562: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:564: socket connected
DEBUG: .../IO/Socket/SSL.pm:586: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:619: using SNI with hostname fundresearch.fidelity.com
DEBUG: .../IO/Socket/SSL.pm:654: request OCSP stapling
DEBUG: .../IO/Socket/SSL.pm:673: set socket to non-blocking to enforce timeout=180
DEBUG: .../IO/Socket/SSL.pm:686: call Net::SSLeay::connect
DEBUG: .../IO/Socket/SSL.pm:689: done Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:699: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:709: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:729: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:686: call Net::SSLeay::connect
DEBUG: .../IO/Socket/SSL.pm:2552: did not get stapled OCSP response
DEBUG: .../IO/Socket/SSL.pm:2505: ok=0 cert=102327360
DEBUG: .../IO/Socket/SSL.pm:689: done Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:692: SSL connect attempt failed

DEBUG: .../IO/Socket/SSL.pm:692: local error: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
DEBUG: .../IO/Socket/SSL.pm:695: fatal SSL error: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
DEBUG: .../lib/Net/HTTPS.pm:69: ignoring less severe local error 'IO::Socket::IP configuration failed', keep 'SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed'
DEBUG: .../IO/Socket/SSL.pm:2682: free ctx 98842176 open=98842176
DEBUG: .../IO/Socket/SSL.pm:2687: free ctx 98842176 callback
DEBUG: .../IO/Socket/SSL.pm:2694: OK free ctx 98842176
Error GETing https://fundresearch.fidelity.com/mutual-funds/fees-and-prices/316343201: Can't connect to fundresearch.fidelity.com:443 at -e line 1.

我能够使用curl 成功检索网页。

最佳答案

TL;DR:升级 Perl 或至少升级 Mozilla::CA 模块,或者将 SSL_ca_file 与您自己的信任存储一起使用。

<小时/>

我怀疑问题是因为您使用的是旧版本的 Perl,特别是此 Perl 中包含的旧版本的 Mozilla::CA 模块。查看此网站的证书链(例如 SSLLabs ),您会发现它如下所示:

[0] CN=fundresearch.fidelity.com
[1] CN=Entrust Certification Authority - L1K
[2] CN=Entrust Root Certification Authority - G2 -- selfsigned

此信任链中的最后一个证书是自签名的,即对此证书的信任来自证书本身。这是服务器的明显错误配置,这就是验证信任链时忽略此证书的原因。

CN=Entrust 证书颁发机构 - L1K 的颁发者 CA 是 CN=Entrust 根证书颁发机构 - G2,即服务器发送的证书,但被忽略,因为人们不应该仅将信任建立在服务器发送的内容上。这意味着本地信任存储中需要有此根 CA 的实例。

现代浏览器和操作系统在信任存储中拥有此 CA,这就是您可以使用浏览器访问此站点的原因。但是,WWW::Mechanize(基于 LWP::UserAgent)不使用系统信任存储(至少在 Windows 上)。相反,信任存储由 Mozilla::CA 模块提供,该模块不时从 Mozilla(即 Firefox)获取信任存储的副本。

根据您的 Perl 发行版的版本,您可能使用 Mozilla::CA 版本 20141217。此版本尚不包括受信任的 CA Entrust 根证书颁发机构 - G2。此 CA 仅包含在下一个 version 20150826 中。由于 CA 不被视为受信任,因此验证将失败。

有几种可能的修复方法。

  • 其中之一是升级 Perl 的版本。这可能是最好的选择,因为这还包括在处理多个可能的信任路径时对 OpenSSL 的修复 - 这是您在其他站点可能遇到的问题(有关更多详细信息,请参阅 here)。
  • 另一种方法是升级 Mozilla::CA 模块。但如果您仍然使用旧的 Perl(其中上述 OpenSSL 问题未得到解决),这实际上可能会导致某些网站出现问题。
  • 或者您可以添加 the missing certificate到您的 cacert.pem(由 Mozilla::CA 提供的)。
  • 最后你可以使用ssl_opts使用 SSL_ca_file 设置您自己的信任存储区,其中包括缺少的 CA 证书。

关于perl - WWW::Mechanize SSL 连接尝试因 https get 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com