今天我面临一个有趣的问题。
我正在使用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
有人知道为什么会这样吗?
httplib2的最新版本默认使用自己的证书存储区。
如果您使用的是ubuntu/debian,那么可以显式地将路径传递到系统证书文件,如
也许是这样的: 我遇到了同样的问题,调试Google Lib时发现原因是我使用的是较旧版本的
httplib2
(0.9.2)。当我更新到最新版本(0.14.0)时,它起作用了。如果已经安装了最新版本,请确保某些库没有在其依赖项中安装较旧版本的
httplib2
。如果你知道你想要得到的网站是一个“好人”,你可以尝试创建这样的“开场白”:
(有趣的部分是
disable_ssl_certificate_validation=True
)从文档中: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http
编辑01:
既然您的问题实际上是为什么会发生这种情况,那么您可以检查this或this。
编辑02:
鉴于访问这个答案的人比我预期的多,我想解释一下何时禁用证书验证可能有用。
首先,对这些证书的工作原理有一点浅显的了解。在上面提供的链接中有很多信息,但不管怎样,还是在这里。
SSL证书需要由一个众所周知的(至少对您的浏览器来说是众所周知的)Certificate Authority来验证。您通常从其中一个机构购买整个证书(Symantec,GoDaddy…)
广义地说,其思想是:那些证书颁发机构(CA)给您一个证书,其中还包含CA信息。您的浏览器有一个众所周知的ca列表,因此当您的浏览器收到证书时,它将执行如下操作:“hmmmmmmm。。。。[浏览器在这里做了一个令人惊奇的脸]。。。我收到了一份证书,上面说是赛门铁克验证的。我认识那个“赛门铁克”吗?[然后浏览器转到其著名的CA列表并检查Symantec]哦,是的!我愿意。好的,证书很好!
如果在浏览器中单击URL旁边的小锁,您可以自己看到该信息:
但是,在有些情况下,您只想测试HTTPS,然后使用几个command line工具创建自己的证书颁发机构,并使用“自定义”CA来签署您刚刚生成的“自定义”证书,对吧?在这种情况下,您的浏览器(顺便说一句,问题是
httplib2.Http
)不会将您的“自定义”CA放在受信任的CA列表中,因此它会说证书无效。信息仍将加密传输,但浏览器告诉您的是,它并不完全信任加密传输到您所假设的位置。例如,假设您为您的
localhost
FQDN创建了一组自定义密钥和CA以及this tutorial之后的所有mambo jumbo,并且您的CA证书文件位于当前目录中。使用自定义证书和其他东西,您很可能在https://localhost:4443
上运行服务器。现在,您的CA证书文件位于当前目录中的文件./ca.crt
(与运行Python脚本的目录相同)。你可以这样使用httplib2
:。。。你不会再看到警告了。为什么?因为你让
httplib2
去找CA的证书./ca.crt
)但是,由于Chrome(引用浏览器)不知道这个CA的证书,它将认为它无效:
同时,证书过期。你有可能在一家公司工作,该公司使用内部站点进行SSL加密。它可以正常工作一年,然后你的浏览器开始抱怨。你去找负责保安的人,问他“哟!!我收到警告了!怎么了?”答案很可能是“哦,天哪!!我忘了换证书了!没关系,从现在开始接受它,直到我解决它。”(真实的故事,尽管我得到的答案中有脏话::-D)
相关问题 更多 >
编程相关推荐