我如何让python httplib接受不受信任的证书?

时间:2011-03-15 23:51:34

标签: python httplib

我如何让python httplib接受不受信任的证书?我在我的网络服务器上创建了一个蛇油/自签名证书,我的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()

2 个答案:

答案 0 :(得分:43)

我的一些脚本在更新计算机后停止工作。事实证明,这就是问题所在:https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection

  

版本2.7.9中已更改:已添加上下文。

     

此类现在默认执行所有必需的证书和主机名检查。要恢复到之前未经验证的行为,可以将ssl._create_unverified_context()传递给context参数。

因此,如果您的Python版本是> = 2.7.9(在我的情况下为2.7.10),您可能会遇到此问题。为了解决这个问题,我更新了我的电话:

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

这可能是保留相同行为的最简单的改变。

答案 1 :(得分:5)

从检查Python 2.7.14源代码,您可以设置一个环境变量

PYTHONHTTPSVERIFY=0

这将导致默认情况下禁用证书验证(这将适用于程序的所有请求)。

我认为这适用于2.7.12+ - 但它不适用于3.x。

参考。 PEP 493:默认情况下验证HTTPS,但允许envvar覆盖它 https://www.python.org/dev/peps/pep-0493/#feature-environment-based-configuration