突发WSS连接故障求助:Ubuntu环境下SSL WebSocket无法建立连接
WebSocket(WSS)连接故障排查思路
背景信息
- 后端:Ubuntu虚拟机 + Apache + Python 3.10 + websockets库,配置Let's Encrypt SSL证书
- 前端:另一台Ubuntu虚拟机 + Apache + WebGL应用,使用独立的Let's Encrypt SSL证书
- 现象:WS协议可正常建立连接,WSS连接失败,Firefox提示
firefox can't establish a connection to the server wss://domain:port - 已确认项:端口已开放(云控制台、ufw、nmap验证),代码回滚至历史可用版本,已重启相关主机
具体排查步骤
1. 验证SSL证书的域名匹配性
- 检查后端WebSocket服务器的
cert.pem对应域名,是否与前端JS中wss://domain:port的domain完全一致(含子域名,Let's Encrypt证书严格匹配域名) - 执行命令查看证书域名信息:
openssl x509 -in ./cert.pem -text -noout,确认Subject Alternative Name字段包含目标域名
2. 检查SSL证书与私钥的有效性、匹配性
- 验证证书与私钥是否匹配:
两个命令的输出必须完全一致,否则说明证书与私钥不匹配openssl x509 -noout -modulus -in cert.pem | openssl md5 openssl rsa -noout -modulus -in privkey.pem | openssl md5 - 检查证书是否过期:
openssl x509 -in cert.pem -enddate -noout,确认过期时间晚于当前日期
3. 排查WebSocket服务器的SSL配置兼容性
- 尝试调整Python代码中的SSL协议版本,确保兼容主流浏览器:
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context.min_version = ssl.TLSVersion.TLS_1_2 ssl_context.max_version = ssl.TLSVersion.TLS_1_3 ssl_context.load_cert_chain(certfile="./cert.pem", keyfile="./privkey.pem") - 检查websockets库版本,执行
pip show websockets,若版本过旧则升级:pip install --upgrade websockets
4. 测试WSS底层连通性与SSL握手
- 使用
wscat直接测试WSS连接(需先安装:npm install -g wscat):
查看输出的具体错误信息(如证书验证失败、握手超时等)wscat -c wss://domain:port - 使用
openssl测试SSL握手:
查看输出中的openssl s_client -connect domain:port -servername domainverify return字段,verify return:1表示验证通过,其他值则说明证书验证存在问题
5. 清理浏览器SSL缓存并查看详细日志
- 在Firefox中清除SSL缓存:打开
about:preferences#privacy,进入“证书”->“查看证书”->“服务器”,删除对应域名的缓存证书 - 开启Firefox调试日志:打开
about:config,设置network.websocket.debug和security.ssl.debug为true,重新尝试连接后查看控制台的详细错误日志
6. 检查端口占用与Apache冲突
- 确认WebSocket服务器端口未被Apache占用:
netstat -tulpn | grep :port,确保只有Python的websockets进程在监听该端口 - 若前端Apache配置了反向代理到WebSocket服务器,检查是否启用
mod_proxy_wstunnel模块,且代理配置正确支持WSS协议
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

