[Python] Python FAQ

0 序

  • 本篇主要摘录、收集Python环境的基础常见问题

1 FAQ for Python

Q: 运行 openai-whisper Python 程序,报 SSL 证书错误ssl.SSLError: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)?

原因分析

Windows 系统证书存储里有一条损坏/结构不完整的证书,pip_system_certs(第三方包 pip-system-certs)在把系统证书注入 Python 的 SSL 信任库时,OpenSSL 解析到这条坏证书直接抛了 ASN1: NOT_ENOUGH_DATA(同一问题也会导致 JupyterLabaiohttp 等报 ssl.SSLError

排查方法

step1 确认是否存在异常证书

  • powershell:
Get-ChildItem Cert:\CurrentUser\Root, Cert:\LocalMachine\Root, Cert:\CurrentUser\CA, Cert:\LocalMachine\CA |
ForEach-Object {
    try { [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($_.RawData) | Out-Null; "OK: $($_.Subject)" }
    catch { "BAD: $($_.Subject) | Thumbprint=$($_.Thumbprint)" }
}
  • 若输出中标记为 BAD 的就是问题证书,然后在 certmgr.msc(证书管理器)里按 Thumbprint 找到并删除它。

⚠️操作证书有风险,删除前请先确认这条证书确实无用。

  • 若没找到 BAD 则也不一定就证明不存在异常证书——你的 PowerShell 脚本用的是 .NET(X509Certificate2)解析,而报错的是 OpenSSL 严格模式解析,两者的标准不同。
step2 确认是否存在:OpenSSL 版本与 Windows 证书存储的兼容性问题

这个报错不一定是"某张证书坏了",而是 OpenSSL 版本与 Windows 证书存储的兼容性问题(常见于 Conda 环境打包的 OpenSSL 3.5.x,证书一多、拼接成 cadata 后 OpenSSL 就崩)。

有网络博文也验证过:同一台机器,OpenSSL 3.5.6 的环境正常、3.5.7 的环境报错。

  • 第1步:确认问题在哪一层

跑这两条命令做对照测试:

(pytorch_env) PS H:\Local\study-python> python -c "import ssl; ssl.create_default_context(); print('default OK')"
pip_system_certs: ERROR: could not inject truststore: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\xxx\.conda\envs\pytorch_env\lib\ssl.py", line 771, in create_default_context
    context.load_default_certs(purpose)
  File "C:\Users\xxx\.conda\envs\pytorch_env\lib\ssl.py", line 592, in load_default_certs
    self._load_windows_store_certs(storename, purpose)
  File "C:\Users\xxx\.conda\envs\pytorch_env\lib\ssl.py", line 584, in _load_windows_store_certs
    self.load_verify_locations(cadata=certs)
ssl.SSLError: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)


(pytorch_env) PS H:\Local\study-python> python -c "import ssl, certifi; ssl.create_default_context(cafile=certifi.where()); print('certifi OK')"
pip_system_certs: ERROR: could not inject truststore: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)
certifi OK
  • IF 第1条失败、第2条成功 → 问题锁定在 【Windows 证书存储】 ↔ 【OpenSSL 兼容层】,与坏证书、网络、代理都无关。 (目前笔者是这个情况
  • IF 2条命令都成功 → 问题只在 pip_system_certs 注入时发生,那直接卸载它就行(见上一条回复的方案 1)。
  • 第2步:按你的环境选解决方案

情况 A:Conda 环境(conda list openssl 能看到 3.5.x 等) 最常见,直接降级 OpenSSL 到稳定版本:

# [1] 查看 openssl 版本 | 大概率会显示 3.5.x(如 3.5.6 / 3.5.7)——这些版本与 Windows 证书存储拼接解析存在已知兼容问题
(pytorch_env) PS H:\Local\study-python\study-deep-learning> conda list openssl
# packages in environment at C:\Users\Johnny\.conda\envs\pytorch_env:
#
# Name                    Version                   Build  Channel
openssl                   3.5.7                hbb43b14_0    defaults
(pytorch_env) PS H:\Local\study-python\study-deep-learning> python -c "import ssl; print(ssl.OPENSSL_VERSION)"
pip_system_certs: ERROR: could not inject truststore: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)
OpenSSL 3.5.7 9 Jun 2026 (注: 异常版本,需要退回到 3.5.5,避免安装 3.5.6 / 3.5.7)

# [2] 降级安装 openssl | 若提示找不到 3.5.5 或已被移除,可以试 3.4.7 等其它稳定版,或先 `conda update openssl` 升到最新看看是否已修复。
conda install openssl=3.5.5

# [3] 二次验证
python -c "import ssl; ssl.create_default_context(); print('OK')"
OK (恢复正常了)

情况 B:系统 Python / venv

优先把 Python 升级到新版(自带更新的 OpenSSL,可能已修复该兼容性问题);
或者检查 libssl-3-x64.dll / libcrypto-3-x64.dll 版本,避免 PATH 里混入 Conda 或其它软件自带的 OpenSSL DLL(用 where libssl-3-x64.dll 确认加载的是哪个)。

情况 C:不想动环境,只想让它跑起来 给 Python 标准库的 ssl.py 打补丁,跳过解析失败的证书。文件路径(注意是 当前 conda 环境/venv 里的,不是 Anaconda 主目录):

<你的环境>\lib\ssl.py
    如: C:\Users\xxx\.conda\envs\pytorch_env\lib\ssl.py

_load_windows_store_certs 方法改成: (未亲测)

def _load_windows_store_certs(self, storename, purpose):
    certs = bytearray()
    try:
        for cert, encoding, trust in enum_certificates(storename):
            if encoding == "x509_asn":
                if trust is True or purpose.oid in trust:
                    try:
                        certs.extend(cert)
                    except Exception:
                        continue  # 跳过坏证书
    except PermissionError:
        warnings.warn("unable to enumerate Windows certificate store")
    return certs
  • 建议/小结

按这个顺序来:先跑第一步对照测试确认层 → 是 Conda 就降级 OpenSSL(情况 A,一劳永逸)→ 不是就卸载 pip-system-certs 或打补丁。
降级 OpenSSL 是这类案例中验证过最有效的方案,执行完把结果(版本号和验证输出)贴给我。

解决方法

可尝试的方法:

  • 方法0 降级 openssl 版本 (亲测有效)
conda install openssl=3.5.5
  • 方法1 跳过 SSL 验证 (亲测无效)

在运行 whisper 程序之前,先在 CMD 中执行:

(pytorch_env) C:\Users\xxx\Desktop>set PYTHONHTTPSVERIFY=0
(pytorch_env) C:\Users\xxx\Desktop>set SSL_CERT_FILE=
  • 方法2 安装 pip-system-certs(亲测无效)
pip install pip-system-certs -i https://mirrors.aliyun.com/pypi/simple/

这个包会让 Python 的 urllib 正确调用 Windows 的证书系统。安装完之后直接重新运行你的 whisper 命令即可,不需要额外设置。
这个包不是 pip 自带的,只是用来让 pip 信任 Windows 系统证书(比如公司内网自签证书)。如果平时不需要访问内网 HTTPS,卸载即可,pip 会恢复默认使用 certifi 的 CA bundle:

# 卸载也可能可以消除 `ssl.SSLError: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4040)`  (亲测有效)
pip uninstall pip-system-certs
  • 方法3 通过 Conda 修复 OpenSSL

如果是 Conda 环境自带的 OpenSSL 有问题:

conda install openssl -y
pip install --upgrade certifi

然后重启终端再试。

  • 方法4 配置代理(公司网络适用)
    如果你在公司内网,可能需要设置代理。

Y 推荐文献

X 参考文献

posted @ 2026-08-25 22:30  千千寰宇  阅读(1)  评论(0)    收藏  举报