【发布时间】:2017-07-27 07:54:45
【问题描述】:
我正在尝试在以“https”开头的网站上使用 urllib.request.urlopen。错误输出为:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
有很多很棒的线程可以解决这个错误。包括提到 SSL Labs 评级的this one。我可以在我测试过的所有其他“https”网站上使用 urllib.request.urlopen。
SSL Labs 显示以下输出:
Key RSA 2048 bits (e 65537)
Issuer Let's Encrypt Authority X3
AIA: http://cert.int-x3.letsencrypt.org/
Signature algorithm SHA256withRSA
Extended Validation No
Certificate Transparency No
OCSP Must Staple No
Revocation information OCSP
Revocation status Good (not revoked)
DNS CAA No (more info)
Trusted Yes
为了澄清,我的问题是:是否有完成握手的解决方案,不包括绕过证书验证?而如果有解决方案,能不能完全在linux、macOS和Windows上的一个python脚本里面解决?
【问题讨论】:
-
请提供您正在使用的服务器名称或 URL。为什么要省略关键信息?这可能是您的副本:Add SSL CA File Using urllib2。这是解决问题的方法:CERTIFICATE_VERIFY_FAILED when using urllib to connect to almerys.com.
-
如果浏览器(客户端库等)已经有缺失的部分,它可以完成握手,但这意味着您正在减少可以与您的服务器通信的客户端数量。无论如何-您是在询问从客户端解决此问题(例如通过将缺少的中间 CA 证书添加到客户端的商店),还是在修复服务器(如果它在您/您的组织的控制之下,您确实应该这样做)?
-
@jww 我省略了那个关键信息,因为我不认为它很关键。我认为这是其他人可能遇到的普遍问题。不过,我不确定我的推理和思考过程与解决问题有何关联。没有第二句话,您评论中的第一句话独立存在。不过,感谢您提供的第二个链接。我能够从 Let's Encrypt 下载 .pem 文件,从而解决了这个问题。我已经在this solution中详细说明了步骤
-
(我认为 URL 的首要重要性,顺便说一句,允许人们实际测试解决方案以在您的实际用例中工作;没有测试用例,尝试的解决方案是猜测-- 无论是编写它的人还是试图确定是否投票赞成/反对它的其他网站用户都无法 100% 确定地确定它对于遇到的现实世界场景是否实际上正确)。跨度>
-
(...对问题的“缺少中间证书”的解释绝对是最明显的符合给定信息的事情,但我不会断言这是唯一可能的原因有问题的错误)。
标签: python ssl urllib handshake pyopenssl