Python Websocket连接遇ssl.SSLError错误,求适配解决方案
解决WebSocket连接的SSL错误:WRONG_SIGNATURE_TYPE
问题场景
使用Python 3.10.10 + websocket-client库建立WSS连接时遭遇SSL错误,相关代码及报错如下:
连接代码:
url = "wss://my.site/websocket" ws = websocket.create_connection(url, sslopt={ "check_hostname": False, "cert_reqs": ssl.CERT_NONE })
报错信息:
File "C:\Python3\lib\ssl.py", line 1342, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997)
已实现的HTTP请求SSL适配方案
在常规HTTPS请求中,通过自定义SslAdapter解决了同类SSL问题,代码如下:
自定义适配器:
class SslAdapter(requests.adapters.HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): ctx = ssl.create_default_context() ctx.set_ciphers('DEFAULT@SECLEVEL=0') self.poolmanager = urllib3.poolmanager.PoolManager( ssl_version=ssl.PROTOCOL_TLS, ssl_context=ctx)
使用方式:
self.session = requests.Session() self.session.mount("https://my.site/", SslAdapter())
目标站点SSL参数
目标站点连接信息:
"Protocol version": "TLSv1.2", "Cipher suite": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "Key Exchange Group": "P256", "Signature Scheme": "RSA-PKCS1-SHA1"
WebSocket的SSL适配方案
参照HTTP的解决思路,通过自定义SSL上下文传入websocket-client的连接参数即可解决问题:
import ssl import websocket # 构建自定义SSL上下文 ctx = ssl.create_default_context() # 降低安全等级,允许目标站点的弱签名算法 ctx.set_ciphers('DEFAULT@SECLEVEL=0') # 保持原代码中的证书验证关闭配置 ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE # 传入自定义上下文建立连接 url = "wss://my.site/websocket" ws = websocket.create_connection(url, sslopt={"ssl_context": ctx})
解决原理
错误WRONG_SIGNATURE_TYPE源于目标站点使用了较旧的RSA-PKCS1-SHA1签名算法,而Python默认的SSL安全等级(SECLEVEL)会限制这类弱算法。通过DEFAULT@SECLEVEL=0降低安全等级,即可允许该签名算法完成SSL握手。
内容的提问来源于stack exchange,提问作者Den
相关产品推荐
相关产品推荐

