Python3.11/3.12升级后遭遇SSL握手失败问题求助
解决Python 3.11/3.12升级后的SSL握手失败问题
问题分析
报错SSLV3_ALERT_HANDSHAKE_FAILURE并非一定是客户端使用了SSLv3协议,通常是服务器与客户端的加密套件不兼容,或者协议协商过程中服务器无法匹配客户端提供的参数。Python 3.11+对默认加密套件做了更严格的限制,移除了一些老旧的、不安全的套件,而你的服务器可能仅支持这些被移除的套件,导致握手失败。
另外你之前的上下文代码存在问题:import ssl语句位置错误,且重复创建上下文覆盖了之前的配置,导致强制TLS 1.2的设置未生效。
解决方案
以下是修正后的代码,通过指定兼容的加密套件、正确配置SSL上下文来解决问题:
import http.client import ssl host = "xyzabcd.com" path = "/getFileDetails" headers = { "User-Agent": "MyApp", "Authorization": "Bearer token" } # 创建SSL上下文,强制使用TLS 1.2并添加兼容的加密套件 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) # 放宽安全级别,兼容服务器支持的老旧加密套件 context.set_ciphers('DEFAULT:@SECLEVEL=1') # 初始化HTTPSConnection时传入上下文 conn = http.client.HTTPSConnection(host, context=context) try: conn.request(method="GET", url=path, headers=headers) response = conn.getresponse() print("Status:", response.status) print("Reason:", response.reason) print("Headers:", response.getheaders()) data = response.read() print("Body:", data.decode("utf-8")) except ssl.SSLError as e: print("SSL Error:", e) except Exception as e: print("Error:", e) finally: conn.close()
关键说明
- 修正上下文创建逻辑:直接使用
ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)创建仅支持TLS 1.2的上下文,避免重复赋值覆盖配置。 - 降低安全级别兼容旧服务器:
DEFAULT:@SECLEVEL=1会放宽加密套件的安全要求,允许使用一些老旧但服务器支持的套件。如果这个设置仍不生效,可以尝试指定具体的加密套件(比如ECDHE-RSA-AES256-SHA384等,需根据服务器实际支持的套件调整)。 - 验证服务器支持的套件:可以使用
openssl s_client -connect xyzabcd.com:443命令查看服务器支持的加密套件,然后在set_ciphers中指定对应的套件列表。
额外排查点
- 检查服务器是否需要SNI支持:Python 3.11+的
HTTPSConnection默认已支持SNI,但如果服务器配置特殊,可以显式指定server_hostname参数:conn = http.client.HTTPSConnection(host, context=context, server_hostname=host) - 确认系统的OpenSSL版本:Python 3.11+依赖的OpenSSL版本较高,如果系统OpenSSL版本过低,可能导致协议或套件支持不足,建议升级系统OpenSSL到1.1.1及以上版本。
内容的提问来源于stack exchange,提问作者Samanth Reddy
相关产品推荐
相关产品推荐

