MacOS下Python SSL证书路径异常致CERTIFICATE_VERIFY_FAILED求助
彻底修复Python SSL证书验证失败(CERTIFICATE_VERIFY_FAILED)的问题
问题背景
使用urllib或requests库发起HTTPS请求时出现CERTIFICATE_VERIFY_FAILED错误,运行Python安装包自带的Install Certificates.command脚本无效。通过以下命令排查发现,Python的ssl模块默认CA证书路径被错误指向了MySQL的安装目录:
python -c 'import ssl; print(ssl.get_default_verify_paths().openssl_cafile)'
输出:
/usr/local/mysql/ssl/cert.pem
目前已通过创建符号链接临时解决,但需要更优的长期修复方案。安装顺序为:先安装官方Python 3.11,再安装MySQL,最后安装Homebrew(怀疑Homebrew是问题诱因)。
最优解决方案
1. 通过环境变量指定正确的CA证书路径(推荐)
这是最简单的全局修复方式,无需修改代码:
- 临时生效:在终端执行以下命令,当前会话内有效:
export SSL_CERT_FILE=/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/certifi/cacert.pem - 永久生效:编辑你的shell配置文件(比如
~/.zshrc或~/.bashrc,取决于你用的shell),添加上述export命令,然后执行:source ~/.zshrc # 对应zsh;如果是bash则用source ~/.bashrc
2. 在代码中显式指定CA证书路径
如果不想修改全局环境变量,可在代码里直接指定验证用的CA证书:
对于requests库:
import requests # 直接在请求中指定verify路径 response = requests.get( "https://目标网址", verify="/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/certifi/cacert.pem" )
对于urllib库:
import ssl import urllib.request # 创建指定CA证书的SSL上下文 ssl_context = ssl.create_default_context( cafile="/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/certifi/cacert.pem" ) # 构建并安装自定义opener opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=ssl_context)) urllib.request.install_opener(opener) # 发起请求 response = urllib.request.urlopen("https://目标网址")
3. 排查Homebrew对OpenSSL的影响
Homebrew安装后可能修改了系统的OpenSSL链接或环境变量,导致Python调用了错误的OpenSSL库:
- 检查当前系统默认的OpenSSL路径:
如果输出是which openssl/usr/local/bin/openssl(Homebrew安装的版本),说明系统优先使用了Homebrew的OpenSSL,进而影响了Python的ssl模块。 - 修复方式:
- 调整PATH环境变量,让系统自带的OpenSSL(路径为
/usr/bin/openssl)优先级更高,编辑shell配置文件,添加:
然后执行export PATH="/usr/bin:$PATH"source ~/.zshrc生效。 - 如果上述方法无效,可卸载当前Python 3.11,重新从官方安装包安装,确保安装过程中使用系统默认的OpenSSL配置。
- 调整PATH环境变量,让系统自带的OpenSSL(路径为
问题原因分析
安装Homebrew后,其可能修改了系统的PATH、SSL_CERT_FILE等环境变量,或者替换了OpenSSL的动态链接库,导致Python的ssl模块读取了错误的默认CA证书路径。而MySQL安装时在/usr/local/mysql/ssl目录下创建了相关证书文件,恰好被错误识别为默认CA证书文件路径。
内容的提问来源于stack exchange,提问作者xnx
相关产品推荐
相关产品推荐

