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-stream
和with-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