如果你知道你要访问的网站是一个“好人”,你可以尝试用以下方式创建你的“打开器”:
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证书需要由一个知名的(至少对你的浏览器来说是知名的)
证书颁发机构进行验证。通常情况下,你可以从这些机构中购买整个证书(
Symantec,
GoDaddy...)
总的来说,思路是这样的:这些证书颁发机构(CA)会给你一个包含
CA信息的证书。你的浏览器有一个知名CA列表,所以当你的浏览器接收到一个证书时,它会做出类似这样的判断:
"HmmmMMMmmm....[浏览器在这里做出怀疑的表情]...我收到了一份证书,它说它是由Symantec验证的。我认识那个“Symantec”家伙吗?[浏览器然后查找其知名CA列表并检查Symantec]哦,是的!我知道。好的,证书是有效的!
如果您点击浏览器地址栏旁边的小锁,就可以自己查看相关信息:
![Chrome certificate information](https://istack.dev59.com/qXBED.webp)
然而,有些情况下,您只想测试HTTPS,并使用几个
命令行工具创建自己的证书颁发机构,然后使用该“自定义”CA签署刚生成的“自定义”证书,对吗?在这种情况下,您的浏览器(顺便说一下,在问题中是
httplib2.Http
)将不会将您的“自定义”CA列入信任的CA列表中,因此它会说证书无效。信息仍将以加密方式传输,但浏览器告诉您的是,它不完全相信正在加密传输到您所假定的位置。
例如,假设您创建了一组自定义密钥和CA,并按照
本教程中的说明为您的
localhost
FQDN创建了所有繁琐的东西,并且您的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](https://istack.dev59.com/lmftY.webp)
此外,证书会过期。有可能你在一家使用SSL加密内部网站的公司工作。它可以正常运行一年,然后你的浏览器开始发出警告。你找到负责安全的人,问道:“嘿!我在这里收到了这个警告!发生了什么?”答案很可能是:“哦,天哪!我忘记更新证书了!没关系,从现在开始接受它,直到我修复它为止。”(真实故事,尽管我收到的回答中有脏话
:-D)