我如何让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()
答案 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