gpt4 book ai didi

node.js - WebSocket 服务器不适用于 SSL

转载 作者:IT老高 更新时间:2023-10-28 23:17:13 26 4
gpt4 key购买 nike

我有一个使用 websockets 的聊天应用程序。我想更进一步并在我的连接上启用加密,但是当我使用 https 切换 http 服务器时,我的连接开始失败。

我生成了一个自签名证书,我在我的所有网站上都使用它(在同一个 TLD 下,这意味着它是一个通配符证书)。我可以确认它是一个有效的证书,所以问题不应该存在。

这是有效的(未加密)

var webSocketServer = require('websocket').server;
var http = require('http');

var server = http.createServer(function() {});
server.listen(webSocketsServerPort, function () {
log("system", "Server is listening on port " + webSocketsServerPort);
});

var wsServer = new webSocketServer({
httpServer: server
});

使用它我现在可以连接到 ws://my.domain:port

这就是起作用的原因

var webSocketServer = require('websocket').server;
var http = require('https');
var fs = require('fs');

var server = http.createServer({
key: fs.readFileSync("path/to/host.key"),
cert: fs.readFileSync("path/to/host.pem")
});
server.listen(webSocketsServerPort, function () {
log("system", "Server is listening on port " + webSocketsServerPort);
});

var wsServer = new webSocketServer({
httpServer: server
});

使用此代码,服务器也启动,我看到日志消息“服务器正在监听..”但是当我尝试在 wss://my.domain:port 连接时,连接可以不成立。

我在浏览器中为证书添加了一个异常(exception),因为我的客户端页面和 websocket 服务器地址在同一个 tld 和子域下。

可能是什么问题?

最佳答案

仅将您要连接到 websocket 的站点添加为异常(exception)是不够的。转到站点 https://my.domain:port(websocket 地址)并将位置添加为异常。 (这在 Firefox 中肯定是必要的一步)

或者,您可以将证书管理器中的证书导入 Authorities

编辑:我可以告诉你什么对我有用。

> openssl genrsa -out key.pem
> openssl req -new -key key.pem -out csr.pem
> openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem

将公用名设置为 localhost

main.js

var https = require('https');
var ws = require('websocket').server;
var fs = require('fs');

var options = {
key:fs.readFileSync('key.pem'),
cert:fs.readFileSync('cert.pem')
};

var server = https.createServer(options,
function(req,res){res.writeHeader(200);res.end();});
server.listen(8000);
var wss = new ws({httpServer:server});

wss.on('request',function(req){
req.on('requestAccepted',function(conn){
conn.on('message',function(msg){
conn.send(msg.utf8Data + " received");
});
})
req.accept(null,req.origin);
});

然后在 https://localhost:8000 的浏览器 (Firefox) 中(添加证书作为异常(exception))

var ws = new WebSocket('wss://localhost:8000/')
ws.onmessage = function(msg){console.log(msg.data)}
ws.send("test")

并收到测试收到

关于node.js - WebSocket 服务器不适用于 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39645141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com