Windows下Conda环境OpenSSL异常NOT_ENOUGH_DATA(_ssl.c:4194)导致HuggingFace、Datasets、PyTorch等SSL问题

情况一:未关闭xx

环境为Windows 11、Anaconda、Python3.8、RTX3050 Laptop、CUDA12.4。项目最初仅需运行 transformers 的 AutoTokenizer,但首先出现 ProxyError 和 ASN1: NOT_ENOUGH_DATA 错误。关闭 Clash 后 tokenizer 恢复正常,说明第一阶段主要受到一些程序影响。

如果报超时retry,可以在代码最开始的地方加一个镜像地址:

import os os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

情况二:datasets 导入即崩溃

随后执行 from datasets import load_dataset 即发生 ssl.create_default_context() 内部异常。由于 import 阶段尚未联网,因此判断不是 HuggingFace 下载失败,而是 Python SSL 初始化失败。

"ssl.py", line 566, in _load_windows_store_certs self.load_verify_locations(cadata=certs) ssl.SSLError: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4194)

最终解决方案

经过多轮验证,最终将 OpenSSL 从 3.5.7 降级到 3.5.5系列后,ssl.create_default_context() 恢复正常,datasets、aiohttp、transformers 均恢复工作。说明根因不是 Python 包,而是 OpenSSL 版本导致 Windows 证书加载异常。

conda install openssl=3.5.5
python -c "import ssl;ssl.create_default_context();print('OK')" OK

排查过程

依次检查 HTTP_PROXY、HTTPS_PROXY、HF_ENDPOINT、aiohttp、datasets、transformers、certifi、Pillow、PyTorch 等组件。

测试 ssl.create_default_context() 发现 Conda 环境失败,而系统 Python 正常。

进一步确认 import ssl; ssl.create_default_context(cafile=certifi.where()) 可以成功,因此 OpenSSL 对 PEM 文件解析正常,仅 Windows 证书仓库读取异常。

随后编写脚本遍历 Windows ROOT、CA、MY 证书,逐张验证 DER->PEM,所有证书均正常,排除了单张损坏证书。

OpenSSL 定位

检查 ssl.OPENSSL_VERSION、_ssl.pyd、where libssl-3-x64.dll、where libcrypto-3-x64.dll、PATH、conda list openssl 等。

确认 Conda 环境使用 OpenSSL 3.5.x,系统 Python 无异常。说明问题集中于 Conda 打包的 OpenSSL 与 Windows 证书仓库兼容性。

经验总结

以后若遇到 ASN1: NOT_ENOUGH_DATA,不要立即重装 datasets、aiohttp、transformers。

优先执行:

import ssl

ssl.create_default_context()

若此处失败,再测试:

import certifi

ssl.create_default_context(cafile=certifi.where())

若后者成功,则几乎可以确定问题位于 Windows Store 与 OpenSSL 的兼容层,而不是网络、代理或 HuggingFace 本身。

建议检查 OpenSSL 版本,并优先尝试降级至稳定版本。