You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

企业代理环境下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
      
    如果需要长期生效,可以把这个环境变量添加到系统配置文件里(比如Linux的~/.bashrc,Windows的系统环境变量设置面板)。
  • 补充:如果不想用环境变量,也可以在代码里全局配置Requests的证书:
    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)
    
    不过这种方法需要修改google.cloud客户端的初始化代码,不如环境变量通用。

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
      
    或者在代码里全局设置:
    import requests
    requests.packages.urllib3.disable_warnings()
    requests.Session().verify = False
    
    同样,部分google.cloud库可以通过传入verify=False参数初始化,但这种方法安全性极低,只建议在测试环境临时使用。

最后提醒你:优先使用第一种配置根证书的方法,不仅能解决当前问题,还能保证所有HTTPS请求的安全性。

内容的提问来源于stack exchange,提问作者m33n

火山引擎 最新活动