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

21 投票
2 回答
27114 浏览
提问于 2025-04-16 13:47

我该怎么让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 个回答

8

通过查看Python 2.7.14的源代码,你可以设置一个环境变量

PYTHONHTTPSVERIFY=0

这样一来,默认情况下就会禁用证书验证(这会影响你程序中的所有请求)。

我认为这个方法在2.7.12及以上版本有效,但在3.x版本中不适用。

参考链接:PEP 493: 默认验证HTTPS,但允许环境变量覆盖这一点

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())

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

撰写回答