我在git页面上托管了一个网站,它使用github.com/websockets/ws这个库在安全的websocket (wss)上通过点击打开视频流。当通过简单的websocket (ws)从http页面连接视频时,一切都很好,但我意识到github页面将通过https托管,而firefox不允许通过https进行不安全的websocket连接,因此需要wss。
为此,我遵循了websockets ws页面上的步骤,websocket服务器在某种程度上“隐藏”在执行证书握手的https服务器后面。问题是:如果我正常使用我的网页,打开连接到视频的wss链接,它不工作,服务器不知道它的存在。如果我第一次使用https://IP:999链接通过IP和端口直接访问服务器,它会检索证书,然后在网站上无限期地工作。
有没有一种方法可以很自然地做到这一点,而不需要我尝试访问无头服务器来进行证书握手?我只想打开一个wss连接,但是必须直接访问服务器来获取证书的开销似乎有点奇怪。
服务器设置如下所示:
const server = https.createServer({
cert: fs.readFileSync('./cert/cert.pem'),
key: fs.readFileSync('./cert/key.pem'),
}, function (req, res) {
console.log(new Date() + ' ' +
req.connection.remoteAddress + ' ' +
req.method + ' ' + req.url);
res.writeHead(200);
res.end("hello foobarbackend\n");
});
this.wsServer = new ws.Server({
server
})
this.wsServer.on("connection", (socket, request) => {
return this.onSocketConnect(socket, request)
})
server.listen(9999, '0.0.0.0');一旦通过https://:9999检索到证书,我就可以在浏览器wss://:9999上播放视频,没有问题,我肯定遗漏了什么。
发布于 2020-05-08 04:14:07
这里的问题完全由SSL/TLS世界来回答。这里的问题是,安全浏览器几乎会默默地拒绝与具有自签名证书的服务器的WSS://连接。我的证书是自签名的。
这就是为什么用户必须首先通过HTTPs直接导航到服务器IP,然后接受警告。从那时起,一切照常。
需要做的是为服务器所在的IP注册一个域名(Droplet)。然后使用certbot为该域生成真正的证书(密钥、证书)。我将上面的cert.pem和key.pem替换为真正生成的。域名可以是类似于mywebsitewhatever.app的任何东西。
现在,在客户端,你可以打开一个连接到wss://mywebsiteanyever.app:9999,浏览器会自动接受它,一切正常。没有要接受的警告或导航到警告页面。
https://stackoverflow.com/questions/61657834
复制相似问题