1

某些特定网站在SSL通信过程中的TLS版本和加密算法的选择,导致使用较高版本 requests 时产生 SSL: SSLV3_ALERT_HANDSHAKE_FAILURE的错误。根据HTTPS 服务的TLS版本支持情况可强制使用1.1 1.2等。按照一般经验,大部分都支持 1.2, 所以示例代码中使用1.2。

tips: 该方案不适用所有此类报错,请多尝试。

import ssl
import requests
from requests.adapters import HTTPAdapter

class SSLAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        """
        tls1.3 不再支持RSA KEY exchange,py3.10 增加TLS的默认安全设置。可能导致握手失败。
        使用 `ssl_context.set_ciphers('DEFAULT')` DEFAULT 老的加密设置。
        """
        ssl_context = ssl.create_default_context()
        ssl_context.set_ciphers('DEFAULT')
        ssl_context.check_hostname = False  # 避免在请求时 verify=False 设置时报错, 如果设置需要校验证书可去掉该行。
        ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2  # 最小版本设置成1.2 可去掉低版本的警告
        ssl_context.maximum_version = ssl.TLSVersion.TLSv1_2  # 最大版本设置成1.2
        kwargs["ssl_context"] = ssl_context
        return super().init_poolmanager(*args, **kwargs)


    
    
sess = requests.session()
sess.mount("https://", SSLAdapter())   # 将上面定义的SSLAdapter 应用起来

resp = sess.get("your url")

joyvw
860 声望11 粉丝

爱生活,爱帮忙,爱coding。


« 上一篇
lnmp安装记录