Python3.10.4打包exe跨设备运行报SSLCertVerificationError问题
问题根因
该报错和代码逻辑、PyInstaller打包操作无关,核心原因是目标站点dashboard.elering.ee的SSL证书链中某张中间证书/根证书恰好到故障当天达到有效期,触发证书过期校验失败。
你自己的设备运行正常,是因为本机Windows系统的受信任根证书库已经自动更新到了该站点替换后的新证书链,或是本地留存了之前请求的有效证书缓存;其他未更新根证书库、无对应证书缓存的设备,在证书过期时间点之后发起请求就会直接抛出该错误,和你是否重新打包exe没有关系,也符合“前一天还能正常跑、第二天突然全量报错”的时间特征。
解决方法
- 临时应急方案(不建议长期生产环境使用):请求时临时关闭SSL证书校验,修改代码如下:
import ssl from urllib.request import urlopen from bs4 import BeautifulSoup as BS # 生成跳过证书校验的SSL上下文 skip_verify_context = ssl._create_unverified_context() raw_info = BS(urlopen(url, context=skip_verify_context),'html.parser')
注意:该方案会跳过SSL证书有效性校验,存在中间人攻击风险,仅适合临时调试、快速跑通流程使用。
- 正规长期方案(推荐):
- 方案1:给所有运行脚本/exe的目标设备安装Windows系统更新,同步最新的受信任根证书库,重启设备后无需修改代码即可正常运行。
- 方案2:打包时将最新的CA根证书库内嵌到exe中,不依赖目标设备的系统证书库:
- 先安装certifi库获取最新的公开可信CA证书集合,执行命令:
pip install certifi - 修改代码,指定请求时使用certifi提供的CA证书文件做校验:
import certifi from urllib.request import urlopen from bs4 import BeautifulSoup as BS raw_info = BS(urlopen(url, cafile=certifi.where()),'html.parser')- 调整PyInstaller打包参数,将certifi对应的证书文件一并打包进单文件exe,确保程序在其他设备运行时能读取到内嵌的有效CA证书,不会因为目标设备系统证书过旧报错。
- 先安装certifi库获取最新的公开可信CA证书集合,执行命令:
常见疑问说明
- 为什么同一份exe前一天在其他设备能正常跑,第二天就报错:SSL证书本身有固定有效期,到达过期时间点后,系统校验逻辑会直接判定证书无效,和exe本身是否改动无关。
- 为什么重新打包还是报错:如果打包时没有把有效CA证书内嵌进去,程序运行时还是会调用目标设备本地的系统证书库做校验,只要目标设备的证书库没更新,就会持续报错。
内容的提问来源于stack exchange,提问作者Roneters
相关产品推荐
相关产品推荐

