You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python连接Microsoft Dataverse API报SSL版本错误问题求助

修复方案

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 发生在与orgabc.api.crm8.dynamics.com:443的SSL握手阶段,且相同参数下Postman、C#可正常调用,可直接排除服务端故障、令牌无效、API版本不兼容问题,核心问题出在Python运行环境的网络层配置,和令牌生成逻辑、urllib3版本、Dataverse Web API版本无直接关联,按以下优先级排查修复即可:

  • 优先排查环境变量代理配置异常
    先运行以下代码打印当前Python进程读取到的代理配置:
    import os
    print("HTTP_PROXY:", os.getenv("HTTP_PROXY"), os.getenv("http_proxy"))
    print("HTTPS_PROXY:", os.getenv("HTTPS_PROXY"), os.getenv("https_proxy"))
    
    90%以上该场景报错都是因为HTTPS_PROXY变量配置了http://开头的普通HTTP代理,且代理不支持CONNECT隧道转发HTTPS流量,握手阶段代理返回的HTTP明文响应被Python当作SSL报文解析,就会触发版本号错误。临时验证可在发起requests请求时显式禁用代理,绕过环境变量配置:
    import requests
    resp = requests.get(
        "https://orgabc.api.crm8.dynamics.com/api/data/v9.2/WhoAmI",
        headers={"Authorization": f"Bearer {access_token}"},
        proxies={"http": None, "https": None}
    )
    
    如果确实需要走内网代理,确认HTTPS_PROXY配置的是支持CONNECT隧道的代理地址,不要把HTTP代理地址直接填入HTTPS_PROXY字段。
  • 其次排查TLS版本不匹配
    Dataverse服务端强制要求使用TLS 1.2及以上版本建立连接,Python 3.6及更早版本、或自定义过SSL上下文的场景可能默认使用TLS 1.0/1.1,握手被服务端重置时也会抛出该错误。可通过自定义HTTP适配器强制会话使用TLS 1.2+:
    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.poolmanager import PoolManager
    import ssl
    
    class TLS12Adapter(HTTPAdapter):
        def init_poolmanager(self, connections, maxsize, block=False):
            self.poolmanager = PoolManager(
                num_pools=connections,
                maxsize=maxsize,
                block=block,
                ssl_minimum_version=ssl.TLSVersion.TLSv1_2
            )
    
    session = requests.Session()
    session.mount("https://", TLS12Adapter())
    # 后续所有Dataverse请求通过该session发起即可
    
  • 最后检查端点URL格式
    检查代码中拼接的Dataverse端点是否误写为http://开头,443端口默认接收HTTPS流量,如果发送明文HTTP请求,服务端返回的HTTP响应被SSL层解析同样会触发版本号错误,必须保证端点前缀为https://。
连通性校验

修复后优先调用WhoAmI接口验证连通性,不要直接调用业务接口,避免业务权限、参数问题干扰排查:

resp = session.get(
    "https://orgabc.api.crm8.dynamics.com/api/data/v9.2/WhoAmI",
    headers={"Authorization": f"Bearer {valid_access_token}", "Accept": "application/json"}
)
print(resp.status_code, resp.json())

返回200状态码及UserId字段即代表连接层问题已解决,后续替换为业务接口即可。

之前操作的降级urllib3、切换Web API版本对该问题无修复作用,不需要保留相关改动。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 05:57:38