Nginx websockets + SSL 不工作(net::ERR_CERT_COMMON_NAME_INVALID)

Posted

技术标签:

【中文标题】Nginx websockets + SSL 不工作(net::ERR_CERT_COMMON_NAME_INVALID)【英文标题】:Nginx websockets + SSL not working (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

【问题讨论】:

【参考方案1】:

为上游配置 SSL - Nginx

先决条件

    NGINX Plus R6 及更高版本或使用--with-streamwith-stream_ssl_module 配置参数编译的最新NGINX 开源 代理 TCP 服务器或上游 TCP 服务器组 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。

摆脱它。

【讨论】:

以上是关于Nginx websockets + SSL 不工作(net::ERR_CERT_COMMON_NAME_INVALID)的主要内容,如果未能解决你的问题,请参考以下文章

用于 SSL PHP 站点和 Websockets WSS 的 Nginx 配置?

websocket + php + nginx - 超级简单

使用来自 certbot 的 ssl 将 websocket nginx 代理设置为 node.js

WebSocket wss:// 在 SSL 上与 Nginx Gunicorn Daphne Channels Redis

修改 nginx 配置以正确反向代理 websockets

websocket ssl 配置 404 问题