gpt4 book ai didi

python - 为什么 python SSL 模块无法验证 graph.facebook.com 证书?

转载 作者:太空狗 更新时间:2023-10-30 03:06:38 28 4
gpt4 key购买 nike

通过将我的浏览器指向 https://graph.facebook.com/me ,我得到一个加密的 HTTPS 连接,证书链是:

  • DigiCert 高保证 EV 根 CA(根)
  • DigiCert 高保证 CA-3
  • *.facebook.com

所以我已经从https://www.digicert.com/digicert-root-certificates.htm下载了根证书(我也从我的浏览器导出了它,diff 显示它们是同一件事),并尝试使用 Python 内置的 SSL 模块来验证连接到 graph.facebook.com 的真实性。

我刚刚执行了示例 http://docs.python.org/library/ssl.html#client-side-operation ,将 ca_cert 替换为“DigiCertHighAssuranceEVRootCA.crt”,将地址替换为 graph.facebook.com。连接尝试失败,出现异常:

ssl.SSLError: [Errno 1] _ssl.c:499: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

如果我针对 ev-root.digicert.com(这是 DigiCert 提供的用于测试客户端是否可以验证其证书的地址)尝试相同的代码和证书,一切正常。通过浏览器,我可以验证此连接中使用的链是:

  • DigiCert 高保证 EV 根 CA(根)
  • DigiCert 高保证 EV CA-1
  • ev-root.digicert.com

通过运行 ssl.get_server_certificate(('graph.facebook.com', 443))我的浏览器获得了标识为“*.facebook.com”的相同证书,这意味着 Python 代码和我的浏览器都获得了相同的证书来验证。

为什么 Chrome 可以使用给定的根证书验证 graph.facebook.com,Python 可以使用相同的根证书验证另一个站点,但 Python 不能验证 graph.facebook.com?

最佳答案

我从 OpenSSL 邮件列表中得到了答案。似乎“DigiCert High Assurance EV Root CA”在自签名之前由另一个证书颁发机构签名。现在有两个版本的证书。一个与 SSL 实现捆绑在一起,由 DigiCert 提供下载,它是自签名的,可以用作根 CA 来验证它签署的其他证书。另一个版本是 Facebook 服务器在 SSL 握手过程中返回的版本,由一些 Entrust 证书签名。两者具有相同的公钥和 keyid。

NSS,Firefox 和 Chrome 的 SSL 实现,显然正确地遵循了 X.509 规范并忽略了服务器发送的链中的最后一个证书,并使用其自己的可信版本“DigiCert High Assurance EV Root CA”来验证链。 Python 的实现基于 OpenSSL,它使用主机提供的证书验证“DigiCert High Assurance CA-3”,然后尝试验证最后一个。由于它是由其他 CA 签名的,而我没有提供该证书,因此它失败了。我不认为这种行为是正确的,因为我已经信任链中间的证书,理论上我不需要检查其余部分。

我的解决方案是向 ssl 模块提供验证“DigiCert High Assurance EV Root CA”的 Entrust 证书。

关于python - 为什么 python SSL 模块无法验证 graph.facebook.com 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7700274/

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