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

Python3.11.4调用API时出现SSLError握手失败问题求助

SSL握手失败(SSLV3_ALERT_HANDSHAKE_FAILURE)问题排查与解决

调用API的代码

import requests  
from requests.auth import HTTPBasicAuth
username = ""
password = ""
response = requests.get(url, headers=headers, auth=HTTPBasicAuth(username, passwrd))

(注:代码里passwrd存在拼写错误,正确应为password)

触发的错误

SSLError: HTTPSConnectionPool(host='', port=): Max retries exceeded with url: '' (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1002)')))

当前使用的依赖版本

requests==2.32.3
requests-mock==1.12.1
urllib3==1.26.18
urllib3-secure-extra==0.1.0
pyOpenSSL==23.1.0
certifi==2024.12.14
idna==3.7
cryptography==40.0.2

排查与解决思路

  1. 强制指定TLS版本
    目标服务器可能不兼容客户端默认的SSL/TLS版本,可手动指定TLS 1.2或1.3尝试:
import requests
from requests.auth import HTTPBasicAuth
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager
import ssl

class TLSAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_TLSv1_2  # 也可替换为ssl.PROTOCOL_TLSv1_3测试
        )

username = ""
password = ""
url = ""
headers = {}

session = requests.Session()
session.mount("https://", TLSAdapter())
response = session.get(url, headers=headers, auth=HTTPBasicAuth(username, password))
  1. 修正证书相关配置
  • 若服务器用自签名证书,需在请求中指定证书文件:
    response = requests.get(url, headers=headers, auth=HTTPBasicAuth(username, password), cert=("/path/to/cert.pem", "/path/to/key.pem"))
    
  • 测试环境可临时跳过证书验证(生产环境绝对禁止):
    response = requests.get(url, headers=headers, auth=HTTPBasicAuth(username, password), verify=False)
    
  1. 修复代码拼写错误
    原代码中passwrd是拼写错误,改为password后再测试,认证失败也可能间接引发握手异常。

  2. 更新核心依赖
    尝试更新cryptography和urllib3到最新稳定版,修复潜在的SSL兼容性问题:

pip install --upgrade cryptography urllib3 requests
  1. 指定兼容的加密套件
    如果服务器限制了加密套件,可手动指定支持的套件列表:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context

# 替换为服务器允许的加密套件,示例为常见兼容套件
CIPHERS = 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'

class CipherAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=CIPHERS)
        kwargs['ssl_context'] = context
        return super().init_poolmanager(*args, **kwargs)

session = requests.Session()
session.mount("https://", CipherAdapter())
# 后续请求使用该session发起

内容的提问来源于stack exchange,提问作者Rohit-Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:57:41