今天我遇到了一个有趣的问题。
我正在使用 foursquare 推荐的 python 库 httplib2 raise
SSLHandshakeError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'),)
在尝试请求 oauth 令牌时
response, body = h.request(url, method, headers=headers, body=data)
在
_process_request_with_httplib2 function
有谁知道为什么会这样?
原文由 user1876339 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您知道您要访问的网站是一个“好人”,您可以尝试像这样创建您的“开场白”:
(有趣的部分是
disable_ssl_certificate_validation=True
)来自文档: http ://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http
编辑 01:
由于您的问题实际上是为什么会发生这种情况,因此您可以检查 this 或 this 。
编辑 02:
看到比我预期更多的人访问了这个答案,我想解释一下 何时 禁用证书验证可能有用。
首先,简单介绍一下这些证书的工作原理。上面提供的链接中有相当多的信息,但不管怎样,就在这里。
SSL 证书需要由众所周知的(至少,您的浏览器所熟知的) 证书颁发机构 进行验证。您通常会从其中一个权威机构( 赛门铁克、 GoDaddy …)购买整个证书
从广义上讲,这个想法是:那些证书颁发机构 (CA) 给你一个证书,其中也包含 _CA 信息_。你的浏览器有一个众所周知的 CA 列表,所以当你的浏览器收到一个证书时,它会做类似这样的事情: “HmmmMMMmmm ….[浏览器在这里做了一个傻脸] ……我收到了一个证书,它说它由 Symantec 验证。我认识那个“Symantec” 的人吗?[浏览器然后转到其知名 CA 列表并检查 Symantec] 哦,是的!我知道。好的,证书很好!
如果您在浏览器中单击 URL 旁边的小锁,您可以自己看到该信息:
但是,在某些情况下,您只想测试 HTTPS,并使用几个 命令行 工具创建自己的证书颁发机构,并使用该“自定义”CA 签署您刚刚生成的“自定义”证书, 正确的?在这种情况下,您的浏览器(顺便说一句,问题是
httplib2.Http
)不会在受信任的 CA 列表中包含您的“自定义”CA,因此它会说证书是无效的。信息仍将以加密方式传输,但浏览器告诉您的是,它并不完全信任以加密方式传输到您假设的目的地。例如,假设您按照 本教程 为您的
localhost
FQDN 创建了一组自定义密钥和 CA 以及所有 mambo-jumbo,并且您的 CA 证书文件位于当前目录中。你很可能有一个服务器运行在https://localhost:4443
使用你的自定义证书等等。现在,您的 CA 证书文件位于当前目录中的文件./ca.crt
(在您的 Python 脚本将运行的同一目录中)。您可以像这样使用httplib2
:……你不会再看到警告了。为什么?因为你告诉
httplib2
去寻找CA的证书./ca.crt
)然而,由于 Chrome(引用浏览器)不知道这个 CA 的证书,它会认为它无效:
此外,证书会过期。您可能在一家使用带 SSL 加密的内部网站的公司工作。它可以正常工作一年,然后您的浏览器开始抱怨。你去找负责安全的人,问 “哟!!我在这里收到这个警告!发生了什么事?” 答案很可能是 “天哪!我忘了更新证书!没关系,从现在开始接受它,直到我解决这个问题。” (真实的故事,虽然我收到的答案中有脏话 :-D )