如何让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 个回答
8
通过查看Python 2.7.14的源代码,你可以设置一个环境变量
PYTHONHTTPSVERIFY=0
这样一来,默认情况下就会禁用证书验证(这会影响你程序中的所有请求)。
我认为这个方法在2.7.12及以上版本有效,但在3.x版本中不适用。
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())
这可能是保持相同行为的最简单的修改。