环境:
Python3.9
requests 2.31
背景:
遇到一个较为老旧的SSL协议的网站。
在requests 2.31下请求报错
Caused by SSLError(SSLError(1, ‘[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1131)’))
而在Linux上直接用curl或者Postman工具则正常
这里有如下思路:
1、降低requests和urllib3的版本
经过尝试,该方案不可行
2、使用适配器
import ssl
import urllib3
import requests.packages.urllib3.exceptions as urllib3_exceptions
warnings.simplefilter("ignore", urllib3_exceptions.InsecureRequestWarning)
class TLSAdapter(requests.adapters.HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.set_ciphers("DEFAULT@SECLEVEL=1")
ctx.options |= 0x4
kwargs["ssl_context"] = ctx
return super(TLSAdapter, self).init_poolmanager(*args, **kwargs)
def login():
url = 'https://login.a.com'
headers = {
'Host': 'login.a.com',
'User-Agent': 'okhttp/3.11',
}
data = {
'passWord': '123456',
'userName': '13666666666'
}
session = requests.session()
session.mount("https://", TLSAdapter())
response = session.post(url=url, headers=headers, params=data, verify=False)
print(response.text)
最后就可以顺利的打印出返回的结果了
出现该问题的原因
requests.exceptions.SSLError错误通常指出在尝试建立一个HTTPS连接时遇到了SSL相关的问题。
错误信息 “[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled” 表示安全连接建立失败,因为旧版本的SSL重协商被认为是不安全的,因此在新版本的requests中已被禁用。
因此requests直接就报错了。尝试重新用适配器的方式去强制设置不去检查安全问题则可以解决这个问题。