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

Mic*_*ICE 17 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()
Run Code Online (Sandbox Code Playgroud)

小智 44

我的一些脚本在更新计算机后停止工作.事实证明,这就是问题所在: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())
Run Code Online (Sandbox Code Playgroud)

这可能是保留相同行为的最简单的更改.

  • 谢谢。我也遇到了这个问题,尽管奇怪的是它是在 Python 2.7.5 中 - 可能是在 CentOS 更新之后。同样的解决方案也在那里发挥作用。不过我确实必须“导入 ssl”。 (2认同)

Ed *_*all 6

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

PYTHONHTTPSVERIFY=0
Run Code Online (Sandbox Code Playgroud)

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

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

参考.PEP 493:默认情况下验证HTTPS,但允许envvar覆盖它 __CODE__