javascript - 自动从 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 的浏览器上毫无问题地播放视频,但我一定遗漏了一些东西。
解决方案
这里的问题完全由 SSL/TLS 世界回答。这里的问题是,安全浏览器几乎会默默地拒绝 WSS:// 与具有自签名证书的服务器的连接。我的证书是自签名的。
这就是为什么用户必须首先通过 HTTPs 直接导航到服务器 IP,然后接受警告。从那里开始一切如常。
需要做的是为服务器所在的 IP 注册一个域名(Droplet)。然后 certbot 用于为域生成真正的证书(密钥、证书)。我用真实生成的替换了上面的 cert.pem 和 key.pem。域名可以是 mywebsitewhatever.app 之类的任何名称。
现在在客户端,您可以打开到 wss://mywebsitewhatever.app:9999 的连接,浏览器将自动接受它并且一切正常。没有警告或导航到警告页面以接受。
推荐阅读
- centura - TD 6.2 IDE 兼容性
- flutter - 如何在 Flutter 中重新格式化来自 Blogger API 的数据
- reactjs - 使用 React Js 根据查询字符串过滤内容
- python - 编写python程序来操作fasta文件
- regex - 配置单元中的正则表达式替换解决方案以屏蔽前 6 个字符
- android - 使用 android studio 离线 React-native 应用程序
- go - 禁用选择语句的默认部分
- java - 如何获取地图中特定字段的值
- kubernetes - 如何将微服务与 Kubernetes 集群内的 NATS docker 映像连接起来
- android - 找不到符号导入 com.example.androiddata.databinding.FragmentDetailBindingImpl;