使用Python Requests访问https://si3.ufc.br时遇SSLError错误求助
解决requests访问si3.ufc.br时的SSL错误
这个WRONG_SIGNATURE_TYPE错误是因为目标服务器的SSL配置与本地OpenSSL默认规则不兼容,仅关闭证书验证(verify=False)或修改全局密码套件无法解决签名类型匹配问题。试试以下方案:
自定义SSL适配器适配目标服务器
创建一个自定义的HTTP适配器,强制使用兼容的TLS版本并调整安全级别,确保请求能匹配服务器的SSL要求:
import requests import ssl from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class CompatibleSSLAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): # 创建SSL上下文 ssl_ctx = ssl.create_default_context() # 降低安全级别以兼容旧签名类型 ssl_ctx.set_ciphers('DEFAULT@SECLEVEL=0') # 强制使用TLSv1.2(该服务器大概率仅支持此版本) ssl_ctx.options |= ssl.OP_NO_TLSv1_3 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1 self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2, ssl_context=ssl_ctx ) # 创建会话并绑定适配器到目标域名 session = requests.Session() session.mount('https://si3.ufc.br', CompatibleSSLAdapter()) # 发送请求 try: resp = session.get('https://si3.ufc.br/', verify=False) print(f"状态码: {resp.status_code}") except Exception as e: print(f"请求失败: {str(e)}")
原理说明
- 目标服务器可能仅支持TLSv1.2,而本地requests默认尝试更高版本的TLS,导致握手失败;
- 将安全级别设为
SECLEVEL=0会放宽OpenSSL的签名类型检查,兼容服务器使用的旧签名算法; - 用
session.mount将适配器绑定到特定域名,不会影响其他URL的请求配置。
内容的提问来源于stack exchange,提问作者andreluizigal
相关产品推荐
相关产品推荐

