11

我收到警告:

/.../local/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:734: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)

我正在阅读文档

如果我知道自己在做什么,我会看到很多关于如何禁用它的帖子,比如这个

但是我仍然无法弄清楚错误的含义。我认为这意味着我缺少证书(因为它只发生在我的 VPS 上,而不是在运行相同版本脚本的 Mac 上),但我不明白为什么我需要证书来发出安全请求到第三方 API

非常感谢一个有用的总结(或只是一个正确方向的点),所以我可以决定是否禁用它。我的直觉是我不应该禁用它,所以我想弄清楚如何正确解决这个问题。

4

1 回答 1

21

我很高兴您没有简单地禁用警告。好问题,实际上!这里需要的是对“信任链”如何运作的基本了解。这并不可惜,许多人对此一无所知。但是,作为开发人员,您应该了解基础知识!来吧,也许阅读一下整个事情是如何运作的。

简而言之,TLS 旨在保证保密性、真实性和完整性。安全社区的常识是(*):如果没有证书验证,您将无法获得三个项目,因为您容易受到中间人攻击。也就是说,验证证书,或者您也可以停止使用 HTTPS。这就是警告的内容。

更多上下文:此安全架构的一部分是远程主机声称拥有由信任链中更高级别的人签署的证书,即所谓的证书颁发机构(CA)。客户端需要验证这个 CA 确实签署了有问题的证书。为了使这种验证工作,客户端需要一个本地数据库,其中包含许多 CA 的公钥(将这些视为“信任锚”,其集合可以称为“证书包”)。

我不明白为什么我需要证书才能向第三方 API 发出安全请求

请阅读其他地方的详细信息。但是,为了这个答案的完整性,这是一个高级抽象,应该澄清为什么需要一些外部信息源:

  • 您的客户端不信任远程端。
  • 因此,您的客户需要让第三方参与并询问远程端的可信度。
  • 该第三方是您本地的许多 CA 的公钥数据库,即所谓的“证书包”。

您可以使用该requests库而不是 urllib3,它默认执行证书验证(并提供自己的 CA 数据库)。

(*) 未经验证的 HTTPS 连接可能比普通 HTTP“更好”,但这需要根据具体情况进行评估。

于 2015-02-09T14:43:15.273 回答