Httplib2不锈钢

2024-04-20 02:07:45 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我面临一个有趣的问题。

我正在使用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

有人知道为什么会这样吗?


Tags: sslgetserverrequestbodyerrorheadersraise
3条回答

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")

也许是这样的: 我遇到了同样的问题,调试Google Lib时发现原因是我使用的是较旧版本的httplib2(0.9.2)。当我更新到最新版本(0.14.0)时,它起作用了。

如果已经安装了最新版本,请确保某些库没有在其依赖项中安装较旧版本的httplib2

如果你知道你想要得到的网站是一个“好人”,你可以尝试创建这样的“开场白”:

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证书需要由一个众所周知的(至少对您的浏览器来说是众所周知的)Certificate Authority来验证。您通常从其中一个机构购买整个证书(SymantecGoDaddy…)

广义地说,其思想是:那些证书颁发机构(CA)给您一个证书,其中还包含CA信息。您的浏览器有一个众所周知的ca列表,因此当您的浏览器收到证书时,它将执行如下操作:“hmmmmmmm。。。。[浏览器在这里做了一个令人惊奇的脸]。。。我收到了一份证书,上面说是赛门铁克验证的。我认识那个“赛门铁克”吗?[然后浏览器转到其著名的CA列表并检查Symantec]哦,是的!我愿意。好的,证书很好!

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

Chrome certificate information

但是,在有些情况下,您只想测试HTTPS,然后使用几个command line工具创建自己的证书颁发机构,并使用“自定义”CA来签署您刚刚生成的“自定义”证书,对吧?在这种情况下,您的浏览器(顺便说一句,问题是httplib2.Http)不会将您的“自定义”CA放在受信任的CA列表中,因此它会说证书无效。信息仍将加密传输,但浏览器告诉您的是,它并不完全信任加密传输到您所假设的位置。

例如,假设您为您的localhostFQDN创建了一组自定义密钥和CA以及this tutorial之后的所有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的证书,它将认为它无效:

enter image description here

同时,证书过期。你有可能在一家公司工作,该公司使用内部站点进行SSL加密。它可以正常工作一年,然后你的浏览器开始抱怨。你去找负责保安的人,问他“哟!!我收到警告了!怎么了?”答案很可能是“哦,天哪!!我忘了换证书了!没关系,从现在开始接受它,直到我解决它。”(真实的故事,尽管我得到的答案中有脏话::-D

相关问题 更多 >