You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块。
  • 修复方式:
    1. 调整PATH环境变量,让系统自带的OpenSSL(路径为/usr/bin/openssl)优先级更高,编辑shell配置文件,添加:
      export PATH="/usr/bin:$PATH"
      
      然后执行source ~/.zshrc生效。
    2. 如果上述方法无效,可卸载当前Python 3.11,重新从官方安装包安装,确保安装过程中使用系统默认的OpenSSL配置。

问题原因分析

安装Homebrew后,其可能修改了系统的PATH、SSL_CERT_FILE等环境变量,或者替换了OpenSSL的动态链接库,导致Python的ssl模块读取了错误的默认CA证书路径。而MySQL安装时在/usr/local/mysql/ssl目录下创建了相关证书文件,恰好被错误识别为默认CA证书文件路径。

内容的提问来源于stack exchange,提问作者xnx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:30:18