解决Python访问HTTPS时SSL证书验证失败的多种方案
本文详细解析Python在访问HTTPS链接时出现[SSL: CERTIFICATE_VERIFY_FAILED]错误的原因,即Python 2.7.9+默认开启证书校验。文章提供了五种临时解决方案,包括环境变量设置、全局禁用验证、创建未验证Context、requests库verify参数设为False以及手动指定CA证书,帮助开发者快速处理自签名证书或系统根证书异常导致的连接问题。
HTTPS SSL证书验证失败原因解析
在通过urllib访问HTTPS链接时,可能会遇到如下报错:IOError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)。该错误表明证书验证未通过,通常发生在网站使用自签名证书或系统根证书存在异常的情况下。
原因分析
自Python 2.7.9版本起,默认启用了服务器证书验证功能。若证书校验失败,程序将拒绝后续操作,此举旨在防止中间人攻击并确保客户端确认服务器身份。当使用自签名证书时,由于系统CA证书库中通常不包含该自签名CA的内容,导致验证失败。
Python访问HTTPS的临时解决方案
临时解决方案
方案一:通过环境变量关闭服务器证书验证
若使用bash shell,可执行以下命令:
echo "export PYTHONHTTPSVERIFY=0" >> ~/.bashrc
source ~/.bashrc
方案二:全局取消服务器证书验证
在代码文件开头添加以下语句:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
方案三:创建取消验证的Context参数(仅影响当前请求)
具体使用示例如下:
import ssl
context = ssl._create_unverified_context()
urllib.urlopen('https://www.baidu.com', context=context)
方案四:在requests库中将verify参数设为False以取消验证
使用示例如下:
requests.get(url, verify=False)
方案五:手动指定CA证书(适用于Python3)
使用示例如下:
import urllib
urllib.request.urlopen("https://example.com/some/info", cafile="ca.pem")
若系统根证书存在问题,可使用certifi提供的CA证书:
import certifi
import urllib
urllib.request.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())
Python3关闭SSL验证补充说明
补充知识:Python3关闭SSL证书验证
常见报错信息如下:
Traceback (most recent call last): File "D:\Python36\lib\site-packages\urllib3\contrib\pyopenssl.py", line 441, in wrap_socket cnx.do_handshake() File "D:\Python36\lib\site-packages\OpenSSL\SSL.py", line 1806, in do_handshake self._raise_ssl_error(self._ssl, result) File "D:\Python36\lib\site-packages\OpenSSL\SSL.py", line 1546, in _raise_ssl_error _raise_current_error() File "D:\Python36\lib\site-packages\OpenSSL\_util.py", line 54, in exception_from_error_queue raise exception_type(errors) OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]
During handling of the above exception, another exception occurred:
https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200f180000bc4e71kd1dr48pievrrg&line=0&app_id=24
由于网址使用了https,经过代理时可能会触发上述报错;
解决方案:
#参数:verify=False
html = requests.get(item_url, headers=headers, verify=False)
# print(html.content)
以上为解决Python访问HTTPS时出现certificate verify failed问题的全部方法,供参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













