Httplib2 SSL 错误

新手上路,请多包涵

今天我遇到了一个有趣的问题。

我正在使用 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 许可协议

阅读 663
2 个回答

如果您知道您要访问的网站是一个“好人”,您可以尝试像这样创建您的“开场白”:

 import httplib2
if __name__ == "__main__":
    h = httplib2.Http(".cache", disable_ssl_certificate_validation=True)
    resp, content = h.request("https://site/whose/certificate/is/bad/", "GET")

(有趣的部分是 disable_ssl_certificate_validation=True

来自文档: http ://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http

编辑 01:

由于您的问题实际上是为什么会发生这种情况,因此您可以检查 thisthis

编辑 02:

看到比我预期更多的人访问了这个答案,我想解释一下 何时 禁用证书验证可能有用。

首先,简单介绍一下这些证书的工作原理。上面提供的链接中有相当多的信息,但不管怎样,就在这里。

SSL 证书需要由众所周知的(至少,您的浏览器所熟知的) 证书颁发机构 进行验证。您通常会从其中一个权威机构( 赛门铁克GoDaddy …)购买整个证书

从广义上讲,这个想法是:那些证书颁发机构 (CA) 给你一个证书,其中也包含 _CA 信息_。你的浏览器有一个众所周知的 CA 列表,所以当你的浏览器收到一个证书时,它会做类似这样的事情: “HmmmMMMmmm ….[浏览器在这里做了一个傻脸] ……我收到了一个证书,它说它由 Symantec 验证。我认识那个“Symantec” 的人吗?[浏览器然后转到其知名 CA 列表并检查 Symantec] 哦,是的!我知道。好的,证书很好!

如果您在浏览器中单击 URL 旁边的小锁,您可以自己看到该信息:

Chrome 证书信息

但是,在某些情况下,您只想测试 HTTPS,并使用几个 命令行 工具创建自己的证书颁发机构,并使用该“自定义”CA 签署您刚刚生成的“自定义”证书, 正确的?在这种情况下,您的浏览器(顺便说一句,问题是 httplib2.Http )不会在受信任的 CA 列表中包含您的“自定义”CA,因此它会说证书是无效的。信息仍将以加密方式传输,但浏览器告诉您的是,它并不完全信任以加密方式传输到您假设的目的地。

例如,假设您按照 本教程 为您的 localhost FQDN 创建了一组自定义密钥和 CA 以及所有 mambo-jumbo,并且您的 CA 证书文件位于当前目录中。你很可能有一个服务器运行在 https://localhost:4443 使用你的自定义证书等等。现在,您的 CA 证书文件位于当前目录中的文件 ./ca.crt (在您的 Python 脚本将运行的同一目录中)。您可以像这样使用 httplib2

 h = httplib2.Http(ca_certs='./ca.crt')
response, body = h.request('https://localhost:4443')
print(response)
print(body)

……你不会再看到警告了。为什么?因为你告诉 httplib2 去寻找CA的证书 ./ca.crt

然而,由于 Chrome(引用浏览器)不知道这个 CA 的证书,它会认为它无效:

在此处输入图像描述

此外,证书会过期。您可能在一家使用带 SSL 加密的内部网站的公司工作。它可以正常工作一年,然后您的浏览器开始抱怨。你去找负责安全的人,问 “哟!!我在这里收到这个警告!发生了什么事?” 答案很可能是 “天哪!我忘了更新证书!没关系,从现在开始接受它,直到我解决这个问题。” (真实的故事,虽然我收到的答案中有脏话 :-D

原文由 BorrajaX 发布,翻译遵循 CC BY-SA 3.0 许可协议

httplib2 的最新版本默认为它自己的证书存储区。

 # Default CA certificates file bundled with httplib2.
CA_CERTS = os.path.join(
     os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")

如果您使用的是 ubuntu/debian,您可以显式地将路径传递给系统证书文件,例如

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")

原文由 Jay Kumar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题