使用Python 3 websocket库无法连接远程安全WebSocket服务器求助
错误原因
- SSL配置参数误用:客户端
sslopt中使用certfile参数是错误的。certfile用于配置客户端向服务端提供自身证书的双向认证场景,而你当前是客户端需要校验服务端的自签名证书,应该使用ca_certs参数指定信任的根证书(也就是你生成的自签名cert.pem),参数用错导致加载PEM文件失败触发报错。 - TLS版本不兼容:你强制指定了
ssl.PROTOCOL_TLSv1,TLS 1.0协议已经被广泛弃用,树莓派上的OpenSSL 1.1.1d默认禁用了TLS 1.0,版本不匹配会导致握手失败。 - 多余添加
keyfile导致阻塞:你后续添加的keyfile是客户端证书对应的私钥配置,你没有开启双向认证不需要该参数。如果你的私钥生成时设置了加密保护,程序会卡住等待输入私钥密码,表现为无输出无响应的阻塞状态。
修复方案
直接修改客户端的sslopt配置即可,参考代码如下:
import ssl import websocket # 修正后的ssl配置 sslopt = { # 不强制指定TLS版本,自动协商最高兼容版本,也可以指定为ssl.PROTOCOL_TLS_CLIENT "ssl_version": ssl.PROTOCOL_TLS_CLIENT, # 用ca_certs指定信任的自签名证书 "ca_certs": "cert.pem", # 如果你的自签名证书的CN/Subject Alternative Name和RASPI_ADDRESS不匹配,可以临时关闭主机名校验,生产环境不建议这么做 "check_hostname": False } ws = websocket.WebSocket(sslopt=sslopt) try: ws.connect("wss://RASPI_ADDRESS:8000") ws.send("Hello, Server") print(ws.recv()) ws.close() except Exception as e: print("Exception: ", e)
额外排查项
如果修改后仍然有问题,可以按以下顺序排查:
- 确认Windows客户端上的
cert.pem文件路径正确,建议写绝对路径避免相对路径读取错误 - 确认树莓派服务端的WebSocket服务正确加载了
cert.pem和对应的key.pem,TLS配置无误 - 可以在Windows上用openssl命令验证连通性:
openssl s_client -connect RASPI_ADDRESS:8000 -CAfile cert.pem,如果能正常握手说明服务端配置没有问题
内容的提问来源于stack exchange,提问作者user397661
相关产品推荐
相关产品推荐

