You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:27:03