如果您知道您要访问的网站是一个“好人”,您可以尝试像这样创建您的“开场白”:
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:
由于您的问题实际上是为什么会发生这种情况,您可以检查this或this。
编辑 02:
看到访问此答案的人数超出了我的预期,我想解释一下何时禁用证书验证可能有用。
首先,简要介绍一下这些证书的工作原理。上面提供的链接中有很多信息,但无论如何,它就在这里。
SSL 证书需要由众所周知的(至少,您的浏览器众所周知)证书颁发机构进行验证。您通常从其中一个权威机构(赛门铁克、GoDaddy ...)购买整个证书
从广义上讲,这个想法是:那些证书颁发机构 (CA) 给你一个证书,其中也包含CA 信息。您的浏览器有一个众所周知的 CA 列表,因此当您的浏览器收到证书时,它会执行以下操作:“HmmMMMMmmm.... [浏览器在此处做出一个自以为是的表情] ...我收到了一个证书,它说它已经过赛门铁克的验证。我认识那个“赛门铁克”人吗? [浏览器然后转到它的知名 CA 列表并检查赛门铁克] 哦,是的!我知道。好的,证书很好!
如果您在浏览器中单击 URL 旁边的小锁,您可以自己查看该信息:
但是,在某些情况下,您只想测试 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)