requests模块之前一直正常的,某一天开始对https的请求都抛错误了:
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
起初,以为是代理不稳定,重启代理无效,然后重启机器,无效。代码问题?把错误代码copy到另一台机器上没问题,把在另外一台机器上正常运行的代码再copy到报错机器还是报证书错误。难道是requests库的问题,试了requests.get请求http没问题。
尝试了各种解决办法,都无果。还是到网上搜下答案吧。找到了两种解决方案:我用的第一种。第二种也备份下。
第一种解决方案:
何谓ssl验证?
SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
在python 2.7中添加一个新的特性,在urlopen请求的时候会验证ssl证书,如果是自签名的ssl证书会出错。
python request ssl error 怎么解决
在request.post 和request.get方法中都有一个verify的参数。把verify参数置为FALSE。
r = requests.get("xxx.com", headers=request_headers, verify=False)
print r.content
第二种解决方案:
试过:
sudo apt-get install ca-certificates
sudo update-ca-certificates
没效果,
最后试了下面的起效的:
sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28
当然,还是有警告:
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
不够,至少可以先用着了。原因估计就是高版本(2016.2.8)的certifi对证书验证更为严格了。