求助:无法连接Python 3.10搭建的安全WebSocket服务器
Python WSS服务器与Node.js客户端Ngrok连接问题解决方案
问题根源
- Ngrok命令格式错误,导致端口转发失效
- Python服务器绑定
localhost,无法接收外部转发请求 - 自签名证书未被客户端信任,触发SSL验证错误
- Node.js客户端连接地址配置错误,指向了本地sockjs服务而非Ngrok转发的WSS服务器
分步修复
1. 修正Ngrok转发命令
当前命令ngrok tcp 3000 tcp://5.tcp.eu.ngrok.io:16233 -> localhost:3000格式错误,正确的TCP转发只需指定本地端口,Ngrok会自动分配公网地址:
ngrok tcp 3000
运行后复制Ngrok输出的公网地址(类似tcp://5.tcp.eu.ngrok.io:16233),客户端连接时使用wss://协议前缀,即wss://5.tcp.eu.ngrok.io:16233。
2. 修改Python服务器绑定地址
原代码绑定localhost仅允许本地请求,需改为0.0.0.0以接收外部转发请求:
import ssl import websockets import asyncio ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) # 生成证书时证书与私钥存于同一文件,此处参数可复用cert.pem ssl_context.load_cert_chain("cert.pem", "cert.pem") async def new_client_connected(websocket): print("新客户端已连接") # 此处添加业务逻辑处理 async def start_server(): print("服务器已启动") # 绑定0.0.0.0允许所有地址访问 await websockets.serve(new_client_connected, '0.0.0.0', 3000, max_size=9000000, ssl=ssl_context) asyncio.run(start_server())
3. 解决自签名证书信任问题
自签名证书默认不被浏览器/客户端信任,可通过以下方式处理:
- 开发环境临时绕过:Chrome浏览器中开启
chrome://flags/#allow-insecure-localhost选项,允许本地地址使用无效证书,重启浏览器生效。 - 全局信任证书(推荐):
- Windows:双击
cert.pem→ 安装证书 → 选择「本地计算机」→ 存储到「受信任的根证书颁发机构」 - macOS:双击
cert.pem→ 打开钥匙串访问 → 找到证书 → 右键「显示简介」→ 信任栏设置「使用此证书时」为「始终信任」 - Linux:将
cert.pem复制到/usr/local/share/ca-certificates/,执行sudo update-ca-certificates
- Windows:双击
4. 修正Node.js客户端连接配置
客户端控制台报错指向https://192.168.0.105:8080/sockjs-node/info,说明客户端未连接到Ngrok转发的WSS服务器,需修改客户端代码,将连接地址改为Ngrok提供的wss://地址,而非本地的8080端口服务。
验证步骤
- 重启Python服务器
- 重新启动Ngrok并复制正确的WSS地址
- 更新Node.js客户端连接地址
- 打开客户端页面,检查开发者控制台是否仍有连接错误
内容的提问来源于stack exchange,提问作者Jakson Molly
相关产品推荐
相关产品推荐

