企业代理环境下Python Requests SSL握手失败问题求助
解决企业代理环境下Requests与Google Cloud Translate API的SSL证书验证问题
我完全懂你的困扰——企业代理的SSL拦截确实会把Python请求库折腾得够呛,尤其是还要用到依赖Requests的google.cloud模块,总不能每次调用都手动加参数对吧?
先给你理清楚核心问题:企业代理会通过自己的根证书解密并重新加密HTTPS流量,浏览器因为提前导入了代理证书所以能正常验证,但Python的Requests默认用的是系统或certifi库自带的证书池,里面没有代理的根证书,这才会抛出SSL验证失败的错误。
下面给你几个通用型解决方案,不用在每次request.get()里单独加参数:
1. 全局配置代理根证书(最安全推荐)
这是最优解,既保证安全又能让所有依赖Requests的库(包括google.cloud)自动生效:
- 第一步:找到企业代理提供的根证书文件,通常是
.crt或.pem格式。 - 第二步:通过环境变量全局指定证书路径:
- Linux/macOS终端执行:
export REQUESTS_CA_BUNDLE="/绝对路径/到/你的代理证书.crt" - Windows命令提示符执行:
set REQUESTS_CA_BUNDLE=C:\绝对路径\到\你的代理证书.crt
~/.bashrc,Windows的系统环境变量设置面板)。 - Linux/macOS终端执行:
- 补充:如果不想用环境变量,也可以在代码里全局配置Requests的证书:
不过这种方法需要修改google.cloud客户端的初始化代码,不如环境变量通用。import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class SSLAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): kwargs['ssl_context'] = ssl.create_default_context(cafile="/路径/到/代理证书.crt") return super().init_poolmanager(*args, **kwargs) # 全局挂载适配器 session = requests.Session() session.mount('https://', SSLAdapter()) # 让google.cloud使用这个session(部分google.cloud库支持传入session参数) from google.cloud import translate_v2 as translate client = translate.Client(transport='requests', session=session)
2. 应急方案:全局禁用SSL验证(不推荐,有安全风险)
如果你暂时无法获取代理证书,只能用这个应急手段,但要注意这会让所有HTTPS请求跳过证书验证,存在中间人攻击风险:
- 通过环境变量禁用:
- Linux/macOS:
export REQUESTS_CA_BUNDLE="" export PYTHONWARNINGS="ignore:Unverified HTTPS request" - Windows:
set REQUESTS_CA_BUNDLE= set PYTHONWARNINGS=ignore:Unverified HTTPS request
同样,部分google.cloud库可以通过传入import requests requests.packages.urllib3.disable_warnings() requests.Session().verify = Falseverify=False参数初始化,但这种方法安全性极低,只建议在测试环境临时使用。 - Linux/macOS:
最后提醒你:优先使用第一种配置根证书的方法,不仅能解决当前问题,还能保证所有HTTPS请求的安全性。
内容的提问来源于stack exchange,提问作者m33n




