Python InsecureRequestWarning真正意味着什么?

时间:2015-02-09 14:02:41

标签: python ssl-certificate urllib3

我收到了警告:

/.../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)

我正在阅读the doc

如果我知道我在做什么,我会看到很多关于如何禁用它的帖子,例如this one

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

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

1 个答案:

答案 0 :(得分:6)

我很高兴你没有简单地禁用警告。真是个好问题!您缺少对“信任链”如何运作的基本理解。这不是一种耻辱,遗憾的是很多人对此并不了解。但是,您作为开发人员需要了解基础知识,真的,请!来吧,看看整个过程是如何运作的。搜索引擎是你的朋友。

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

更多上下文:此安全体系结构的一部分是远程主机声明使证书由信任链中较高的人签名,称为certificate authority(CA)。客户需要验证此CA实际上已签署该相关证书。要使此验证起作用,客户端需要一个具有许多CA“密钥”的本地数据库。

  

我不明白为什么我需要证书来提出安全请求   到第三方API

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

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

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

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