企业代理环境下PyCharm中Python脚本SSL证书验证失败求解
看起来你遇到的是企业代理SSL拦截导致的证书验证问题——这类代理会替换目标网站的SSL证书,用自己的根证书签名,而Python的requests库默认只信任官方的CA证书池,所以会触发验证失败的报错。PyCharm的Server Certificates设置是给IDE自身的网络请求用的(比如插件下载、远程服务器连接),不会影响Python运行时的证书验证逻辑,所以得从Python/requests的层面来针对性配置。
下面是几个可行的解决方案,按推荐程度排序:
1. 给requests指定代理根证书(最安全,项目级配置)
首先需要导出企业代理的根证书:
- 用Edge/IE访问任意HTTPS网站(比如谷歌),点击地址栏的🔒图标 → 「证书」→ 切换到「证书路径」标签,找到最顶层的企业根证书 → 点击「查看证书」→ 「详细信息」→ 「复制到文件」→ 选择「Base64编码的X.509(.CER)」格式,保存成
proxy-cert.pem文件(注意路径不要包含中文或空格)。
然后修改你的代码,在requests.get里指定这个证书路径:
import os proxy = 'http://user:password@proxyname:port' os.environ['http_proxy'] = proxy os.environ['HTTP_PROXY'] = proxy os.environ['https_proxy'] = proxy os.environ['HTTPS_PROXY'] = proxy import requests # 替换成你的证书实际绝对路径 r = requests.get('https://www.google.com', verify='C:/certs/proxy-cert.pem') print(r.text)
2. 设置环境变量让requests自动加载证书(项目/全局级)
不需要修改代码,直接在PyCharm的运行配置里添加环境变量即可:
- 打开
Run → Edit Configurations,找到你的Python脚本配置项 - 在
Environment variables区域点击「+」,添加:- 变量名:
REQUESTS_CA_BUNDLE,变量值:你的代理证书绝对路径(比如C:/certs/proxy-cert.pem)
- 变量名:
- 保存配置后运行脚本,
requests会自动用这个证书完成验证,不会再出现报错。
如果想让所有Python项目都生效,可以直接在Windows系统环境变量里添加REQUESTS_CA_BUNDLE。
3. 把代理证书追加到Python的全局CA证书池(全局级)
Python的certifi库管理着默认的CA证书池,你可以把代理证书加入这个池:
- 找到Python3.6安装目录下的
Lib\site-packages\certifi\cacert.pem文件(比如C:\Python36\Lib\site-packages\certifi\cacert.pem) - 用记事本打开这个文件,把你导出的
proxy-cert.pem里的内容(从-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----的完整区块)追加到文件末尾 - 保存后,所有使用
certifi的库(包括requests)都会自动信任这个代理证书。
⚠️ 注意:升级certifi库会覆盖这个文件,所以之后如果更新了certifi,需要重新执行一次追加操作。
为什么PyCharm的设置没用?
PyCharm的Settings → Tools → Server Certificates是用来管理IDE自身信任的证书的,比如IDE连接远程服务器、下载插件时的证书验证,和Python运行时的requests库属于两个完全独立的证书体系,所以你之前的设置不会对脚本运行产生影响。
最后提醒:尽量不要长期使用verify=False,这会关闭SSL证书验证,存在安全风险,以上方法都能帮你在保持验证的前提下解决问题。
内容的提问来源于stack exchange,提问作者clex

