使用 Let’s Encrypt 证书排除 WebSocket 连接问题

遇到 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 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论