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
排查与解决思路
- 强制指定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))
- 修正证书相关配置
- 若服务器用自签名证书,需在请求中指定证书文件:
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)
修复代码拼写错误
原代码中passwrd是拼写错误,改为password后再测试,认证失败也可能间接引发握手异常。更新核心依赖
尝试更新cryptography和urllib3到最新稳定版,修复潜在的SSL兼容性问题:
pip install --upgrade cryptography urllib3 requests
- 指定兼容的加密套件
如果服务器限制了加密套件,可手动指定支持的套件列表:
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
相关产品推荐
相关产品推荐

