nodejs 配置https 该如何处理socket.io 的连接问题呢
 发布于 8 年前  作者 Sirormy  12656 次预览  最后一次回复是 8 年前  来自 问答 

是这样的, 我这边的 nodejs 项目的 https 是在 nginx 一层做的, 也就是说 server 端没有 https 部分的东西, 仅在 nginx 一层做了 https 的处理.

问题来了, 我在 nodejs 创建的 socket.io 服务是 http 的, 页面请求的是 https 的, 报了 ERR_INSECURE_RESPONSE 错误,

这种情况该如何处理呢

=========================================================================================================

最后是这么解决的,nodejs 那边还是 http 的服务,socketio 的端口直接就是 http 的端口,

在 nginx 的配置中添加了

 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";

nginx 配置了全站 https 页面连接 socket, var socket = io() 即可

关键词 nginx proxy websocket,nginx websocket 传送门

完结。

9 回复
DevinXian

你的socket.io连接的是哪两端。两端同时使用secure协议咯

magicdawn

nginx https 证书没配好

Sirormy

@DevinXian 页面和nodejs啊, nodejs那边是http的

Sirormy

@magicdawn 证书设置都正常的。页面上获取直接 var socket = io() 就正常了, 但是 io(‘xxx.xxx.xxx.xxx’) 连接就被拒绝了,想不明白。

vincentLiuxiang

@Sirormy 你需要在浏览器设置一下,相信你的证书。 浏览器端用wss://domian:port/xxx,

如果https://domian:port或https://domian对应的证书,不是浏览器认为安全的证书,

websocket协议并不会像,通过https访问那样,会给你一个安全警告, 而是直接报ERR_INSECURE_RESPONSE 错误

所以你要做的事情跟简单: 1、通过浏览器访问一下https://domian:port或https://domian, 2、浏览器会给一个警告,说这个网站不安全, 3、点击高级-- > 继续访问

你再次访问wss://domian:port/xxx,就ok 了。

nnliang

有没有试过nodejs创建服务器的时候就把证书之类的加进去呢

var https = require('https');
var fs = require('fs');

var options = {
	pfx:fs.readFileSync('./keys/server.pfx'),
	passphrase:'your password'
};

https.createServer(options,function(req,res){
	res.writeHead(200);
	res.end('hello world\n');
}).listen(3000,'127.0.0.1');
Sirormy

@nnliang 这个倒是试过,但是有人跟我说 nodejs 就应该在 Nginx 层做,两边都做的话没有必要,也浪费CPU

Sirormy

@vincentLiuxiang 证书不是自签的,按理说应该是信任的