我收到了警告:
/.../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.
非常感谢一个有用的摘要(或只是正确方向上的一点),所以我可以决定是否禁用它.我的直觉是我不应该禁用它,所以我想弄清楚如何正确解决问题.
解决方法:
我很高兴你没有简单地禁用警告.真是个好问题!您缺少对“信任链”如何运作的基本理解.这不是一种耻辱,遗憾的是很多人对此并不了解.但是,作为开发人员,您需要了解基础知识,真的,请!来吧,看看整个过程是如何运作的.搜索引擎是你的朋友.
简而言之,TLS加密旨在保证保密性,真实性和完整性.安全社区的常识是(*):如果没有证书验证,您将无法获得这三项,因为您在中间攻击中容易受到攻击.也就是说,验证证书,或者您也可以停止使用HTTPS.这就是警告的内容.
更多上下文:此安全体系结构的一部分是远程主机声称拥有由信任链中较高的人签名的证书,即所谓的certificate authority(CA).客户端需要验证此CA是否确实签署了相关证书.为了使此验证起作用,客户端需要具有许多CA的“密钥”的本地数据库.
I don’t understand why I need a certificate to make a secure request
to a third-party API
请阅读其他地方的详细信息.但是,为了完成这个答案,这是一个高级抽象,应该澄清为什么需要一些外部信息源:
>您的客户端不信任远程端.
>因此,您的客户需要让第三方参与并询问远程端的可信度.
>第三方是许多CA的公钥的本地数据库,即所谓的“证书包”.
您可以使用requests
库而不是urllib3,它默认执行证书验证(并提供自己的CA数据库).
(*)未经验证的HTTPS连接可以比普通HTTP“更好”,但这需要根据具体情况进行评估.