[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决办法

本文最后更新时间 ☞

问题现象

场景

安装 Python 后,使用 speedtest python 来测速。

问题

测速失败,错误如下:

speedtest
Retrieving speedtest.net configuration...
Cannot retrieve speedtest configuration
ERROR: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>


问题分析

这种 Python SSL 错误通常出现在 Python 中加载页面时使用了 https 协议(如使用 urllib, urllib2, httplib等)的情况下。错误一般长得像这样(当然行号肯定不一样了):

self._sslobj.do_handshake()
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:110)

在新版本的 Python 中,服务器证书验证被默认启用,这样做可以防止中间人攻击,并且客户端可以通过它来确认服务端身份。


解决办法

方法一

简单方法但不安全:命令关闭证书认证。

PYTHONHTTPSVERIFY 环境变量置 0

export PYTHONHTTPSVERIFY=0

然后再运行 Python 脚本。

方法二

将以下代码插入脚本中进行 https 请求的地方之前:

import os, ssl
if (not os.environ.get('PYTHONHTTPSVERIFY', '') and
getattr(ssl, '_create_unverified_context', None)):
ssl._create_default_https_context = ssl._create_unverified_context

保存后再执行 Python 脚本。

发表评论