遇到 WebSocket 连接失败可能会令人沮丧,尤其是当它们似乎与 SSL/TLS 证书有关时。最近,我遇到了一个 WebSocket 连接问题,连接到 wss://rpc.xxx.com/ws 失败。以下是我诊断和解决问题的方法,以确保过程顺利并为他人提供信息。
作者:qc_chaineye
源自:medium.
初步诊断
错误信息显示 WebSocket 连接存在潜在问题:
WebSocket connection to wss://rpc.xxx.com/ws failed.
怀疑证书过期
我的第一直觉是 Let’s Encrypt 证书可能过期了。为了更新证书,我执行了以下命令:
/root/.acme.sh/acme.sh --renew -f -d rpc.xxx.com
但是日志显示证书没有过期:
"expires":"2024-08-19T03:09:04Z"
检查 Nginx 日志
接下来,我检查了 Nginx 的访问和错误日志,但没有发现相关的 /ws HTTP 1.1 日志,这表明请求没有到达 Nginx。
分析 WebSocket 数据包
为了深入研究,我使用 tcpdump
捕捉 WebSocket 数据包:
sudo apt-get update
sudo apt-get install tcpdump
sudo tcpdump -i any -w websocket_capture.pcap port 443
将捕获文件传输到本地计算机后,我在 Wireshark 中打开该文件并跟踪 TCP 流。我注意到与证书检查有关的 URL,如
http://zerossl.crt.sectigo.com/ZeroSSLECCDomainSecureSiteCA.crt
这表明服务器收到了 WebSocket 请求数据包,但由于证书问题而拒绝了它们。
更新证书
我决定再次更新证书,确保域的 HTTP 可访问性:
1. 重新命名 SSL 配置:
mv /etc/nginx/conf.d/xxx-rpc.ssl.conf /etc/nginx/conf.d/xxx-rpc.ssl.conf.bak
2. 创建 HTTP 配置:创建包含以下内容的 /etc/nginx/conf.d/xxx-rpc.conf:
server {
listen 80;
server_name rpc.xxx.com;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_read_timeout 999999999;
proxy_connect_timeout 10800s;
proxy_send_timeout 10800s;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
add_header 'Access-Control-Allow-Origin' 'https://www.b.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Max-Age' 1728000 always;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'https://www.b.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Max-Age' 1728000 always;
add_header Content-Type application/json always;
return 200;
}
}
location /ws {
proxy_pass http://localhost:8765;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
add_header 'Access-Control-Allow-Origin' 'https://www.b.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Max-Age' 1728000 always;
}
server_tokens off;
}
3. 更新证书:
/root/.acme.sh/acme.sh --renew -f -d rpc.xxx.com
更新过程成功:
4. 重启 Nginx:
service nginx restart
结论
采取这些步骤后,与 wss://rpc.xxx.com/ws 的 WebSocket 连接已成功重建。通过确保正确更新 SSL 证书和正确配置 Nginx,问题得以解决。
按照这种方法,你可以有效地诊断和修复与 SSL 证书有关的 WebSocket 连接问题。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。