【问题标题】:Nginx websockets + SSL not working (net::ERR_CERT_COMMON_NAME_INVALID)Nginx websockets + SSL 不工作(net::ERR_CERT_COMMON_NAME_INVALID)
【发布时间】:2018-07-03 10:42:40
【问题描述】:

我在 Nginx 上运行 websocket 服务器时遇到问题。这是我的 Nginx default.conf:

upstream websocket {
    server xx.xx.xx.xx:8080;
}

server {
    listen 80;
    listen [::]:80;
    server_name domain.com *.domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;

    root /var/www/html;

    index index.php index.html index.htm index.nginx-debian.html;

    server_name domain.com *.domain.com;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    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;
    }

}

我在 chrome 中收到以下错误:

(索引):2 WebSocket 连接到“wss://xx.xx.xx.xx/ws:8080”失败:连接建立错误:net::ERR_CERT_COMMON_NAME_INVALID

我认为这与证书 (SSL) 有关,但我真的不知道如何解决这个问题!

提前致谢!

编辑:

我的 index.php 文件是

<script>
    var conn = new WebSocket('wss://xx.xx.xx.xx/ws');
    conn.onopen = function(e) {
    console.log("Connection established!");
};
</script>

当我将 xx.xx.xx.xx 更改为 domain.com 时,我收到握手错误代码 504。

顺便说一句,我正在通过 php (php server.php) 运行一个 websocket 服务器,并按照以下示例使用棘轮:http://socketo.me/docs/hello-world

【问题讨论】:

    标签: nginx websocket


    【解决方案1】:

    为上游配置 SSL - Nginx

    先决条件

    1. NGINX Plus R6 及更高版本或使用--with-streamwith-stream_ssl_module 配置参数编译的最新NGINX 开源
    2. 代理 TCP 服务器或上游 TCP 服务器组
    3. SSL 证书和私钥

    示例配置:

    stream {
            upstream websocket {
                 server backend1.example.com:8080;
    
        }
    
        server {
            listen                8080 ssl;
            proxy_pass            websocket;
    
            ssl_certificate       /etc/ssl/certs/server.crt;
            ssl_certificate_key   /etc/ssl/certs/server.key;
            ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers           HIGH:!aNULL:!MD5;
            ssl_session_cache     shared:SSL:20m;
            ssl_session_timeout   4h;
            ssl_handshake_timeout 30s;
        …
         }
    }
    

    更多详情请点击此链接https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-tcp/

    【讨论】:

    • 谢谢,我试试这个!
    • error: nginx: [emerg] "stream" 指令在 /etc/nginx/sites-enabled/default:37 中是不允许的
    • NGINX Plus R6 及更高版本或使用 --with-stream 和 with-stream_ssl_module 配置参数编译的最新 NGINX 开源代码。我希望您使用的是开源版本,默认情况下未启用此流
    • 是的,我使用的是开源版本。我现在正在阅读如何启用此模块。
    • 第 1 步:从 git 中检出与您正在使用的 nginx 版本相对应的代码。
    【解决方案2】:

    在您提供的代码中没有提及端口,但您正尝试直接从浏览器到您的 websocket 服务器建立安全的 websocket 连接,该服务器在端口 8080 上运行。因此此消息:

    (index):2 WebSocket 连接到“wss://xx.xx.xx.xx/ws:8080”失败: 连接建立错误:net::ERR_CERT_COMMON_NAME_INVALID

    你应该做的是连接到 Nginx,它正在侦听端口 443,然后让 Nginx 代理请求。您的页面上一定有一些代码指定端口 8080。

    摆脱它。

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2017-08-06
      相关资源
      最近更新 更多