OS X系统Python 3.6安装certifi后仍出现SSL证书失败问题
解决OS X下Python 3.6 SSL证书失败(certifi安装后无效)的方案
我之前在OS X上跑Python 3.6脚本时也踩过这个SSL证书的坑,装了certifi还是报错,折腾了一阵才搞定,给你几个实用的排查和解决步骤:
1. 确保certifi正确关联到Python 3.6
OS X经常会有多个Python版本共存,很容易把certifi装到其他版本里去。先验证下:
- 打开终端运行:
python3.6 -m pip show certifi
输出里的Location路径应该指向/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages,如果不是,说明装错版本了,重新用python3.6 -m pip install --upgrade certifi安装。
2. 强制脚本使用certifi证书
有时候Python的默认SSL上下文不会自动加载certifi的证书,你可以在代码里手动指定:
import certifi import ssl import urllib3 # 创建使用certifi证书的SSL上下文 ssl_ctx = ssl.create_default_context(cafile=certifi.where()) # 用这个上下文初始化连接池 http = urllib3.PoolManager(ssl_context=ssl_ctx) # 之后用http.request发起请求,比如: response = http.request('GET', 'https://你的目标网址')
如果用的是requests库,也可以手动指定verify参数:
import certifi import requests response = requests.get('https://你的目标网址', verify=certifi.where())
3. 检查OS X系统证书状态
系统根证书损坏或过期也会导致这个问题:
- 打开「钥匙串访问」应用,在「系统」分类下查看根证书,确认没有红色叉号的过期证书。
- 尝试重置系统证书信任设置:终端运行
sudo security set-trust-settings-global -d,输入密码后重启终端再运行脚本。
4. 验证Python的SSL依赖版本
Python 3.6的SSL模块依赖OpenSSL,版本太旧也会出问题:
- 终端运行:
python3.6 -c "import ssl; print(ssl.OPENSSL_VERSION)"
如果输出的OpenSSL版本低于1.0.2,建议用Homebrew安装最新版OpenSSL,然后重新编译Python 3.6(这个步骤稍复杂,优先试前面的方法)。
附你提供的报错信息
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 601, in urlopen
chunked=chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/...
内容的提问来源于stack exchange,提问作者Christopher Simmons
相关产品推荐
相关产品推荐

