首页 > 解决方案 > 自动从 https/ws 服务器获取服务器证书

问题描述

我在 git 页面上托管了一个网站,该网站使用以下库通过安全 websocket(wss)在某些点击时打开视频流:github.com/websockets/ws。当通过简单的 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 的浏览器上毫无问题地播放视频,但我一定遗漏了一些东西。

标签: javascriptnode.jssslhttpswebsocket

解决方案


这里的问题完全由 SSL/TLS 世界回答。这里的问题是,安全浏览器几乎会默默地拒绝 WSS:// 与具有自签名证书的服务器的连接。我的证书是自签名的。

这就是为什么用户必须首先通过 HTTPs 直接导航到服务器 IP,然后接受警告。从那里开始一切如常。

需要做的是为服务器所在的 IP 注册一个域名(Droplet)。然后 certbot 用于为域生成真正的证书(密钥、证书)。我用真实生成的替换了上面的 cert.pem 和 key.pem。域名可以是 mywebsitewhatever.app 之类的任何名称。

现在在客户端,您可以打开到 wss://mywebsitewhatever.app:9999 的连接,浏览器将自动接受它并且一切正常。没有警告或导航到警告页面以接受。


推荐阅读