簡體   English   中英

通過nginx 1.10.3和LetsEncrypt的安全WebSocket連接

[英]Secure WebSocket Connection through nginx 1.10.3 and LetsEncrypt

因為我無法找出為什么無法通過HTTPS連接到WebSocket服務器的原因而一直在HTTPS

因此,我有一台運行vue應用程序的Express 4服務器。 它使用npm中的ws庫連接到WebSocket服務器。 Nginx是1.10.3。 我使用LetsEncrypt保護它。

當我上網時,會收到(在控制台中):

main.js:12與'wss://play.mysite.com:8443 /'的WebSocket連接失敗:連接建立錯誤:net :: ERR_CONNECTION_CLOSED

第12行:

window.ws = new WebSocket( ${tls}://${window.location.hostname}:${port} );`

那是wss://play.mysite.com:8443 它確實在子域上。

這是我的nginx塊: update:我明白了!

upstream websocket {
    server 127.0.0.1:8443;
}

server {
    root /var/www/play.mysite.com/dist;
    index index.html;

    access_log /var/log/wss-access-ssl.log;
    error_log /var/log/wss-error-ssl.log;

    server_name play.mysite.com www.play.mysite.com;

    location /ws {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    listen [::]:443 ssl ipv6only=on default_server; # managed by Certbot
    listen 443 ssl http2 default_server; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/play.mysite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/play.mysite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

如您所見,我們在https://play.mysite.com上有子域。 我的Express服務器始終在端口4000上偵聽,而WebSocket服務器在生產時偵聽wss /端口8443

當我查看/var/log/wss-error-ssl.log ,我得到:

2018/03/01 04:45:17 [錯誤] 30343#30343:在連接到上游時* 1 connect()失敗(111:連接被拒絕),客戶端:68.117.172.118,服務器:play.mysite.com,請求: “ GET /static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css HTTP / 1.1”,上游:“ http://[::1]:4000/static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css ”,主機:“ play.mysite。 com”,引薦來源網址:“ https://play.mysite.com/

那么,我到底在做什么錯?

proxy_pass設置正確。 在兩個客戶端/服務器上偵聽WebSocket端口8443 什么意思? 謝謝。

編輯:是的,我知道端口8443正在運行:

root@MySITE:/var/www/play.mysite.com# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:https                 *:*                     LISTEN
tcp        0      0 localhost:4000          *:*                     LISTEN
tcp        0      0 localhost:mysql         *:*                     LISTEN
tcp        0      0 *:http                  *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp6       0      0 [::]:8443               [::]:*                  LISTEN
tcp6       0      0 [::]:https              [::]:*                  LISTEN
tcp6       0      0 [::]:http               [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
udp        0      0 *:bootpc                *:*
udp        0      0 45.76.1.234.vultr.c:ntp *:*
udp        0      0 localhost:ntp           *:*
udp        0      0 *:ntp                   *:*
udp6       0      0 2001:19f0:5:2b9c:54:ntp [::]:*
udp6       0      0 fe80::5400:1ff:fe61:ntp [::]:*
udp6       0      0 localhost:ntp           [::]:*
udp6       0      0 [::]:ntp                [::]:*

TL'DR為/websocket添加第二個位置塊,並使javascript客戶端命中wss://play.mysite.com/websocket

我看到您的Nginx服務器配置有幾個問題。

  1. Nginx不在端口8443上偵聽,但您的JavaScript卻訪問了wss://play.mysite.com:8443 因此,盡管nginx為play.mysite.com域提供了端口44380 ,但您的javascript試圖使用wss (TLS)繞過nginx並直接play.mysite.com -盡管我想您打算將SSL卸載到Nginx上。 wss調用必須通過nginx才能成功進行SSL握手。

  2. 您正在將所有呼叫傳遞給localhost:4000 相反,我建議您有兩個位置塊location / { ... }location /websocket { ... } 這樣,在第二個websocket位置塊中,您可以將調用代理傳遞給localhost:8443 這將要求客戶端連接到wss://play.mysite.com/websocket

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM