如何使Python的httplib接受不受信任的证书?

21

如何让 Python httplib 接受不受信任的证书?我在我的 Web 服务器上创建了一份自签名证书,但是我的 Python 客户端由于使用了不受信任的证书而无法连接。

我宁愿在客户端代码中解决这个问题,而不是将其信任于我的系统。

import httplib


def main():
    conn = httplib.HTTPSConnection("127.0.0.1:443")
    conn.request("HEAD","/")
    res = conn.getresponse()
    print res.status, res.reason
    data = res.read()
    print len(data)


if __name__ == "__main__":
    main()

你确定发生了什么吗?文档中说“这不会对服务器证书进行任何验证”,因此它应该接受自签名证书。 - Glenn Maynard
2个回答

46

我更新了电脑后,发现我的一些脚本停止工作了。原来问题出在这里:https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection

从版本2.7.9开始更改:添加了上下文。

该类现在默认执行所有必要的证书和主机名验证检查。如果要恢复到以前的未经验证行为,请将ssl._create_unverified_context()传递给上下文参数。

因此,如果你的Python版本 >= 2.7.9(在我这里是2.7.10),你可能会遇到这个问题。要解决它,我更新了我的调用:

httplib.HTTPSConnection(hostname, timeout=5, context=ssl._create_unverified_context())

这很可能是保持相同行为的最简单的更改。


2
谢谢。我也遇到了这个问题,尽管它发生在Python 2.7.5上,很奇怪 - 可能是CentOS更新后的结果。相同的解决方案也适用于那里。不过我确实需要import ssl - mwfearnley

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接