WebSocket TLS 证书设置乐趣
Posted
技术标签:
【中文标题】WebSocket TLS 证书设置乐趣【英文标题】:WebSocket TLS certificate setup fun 【发布时间】:2020-05-31 03:14:50 【问题描述】:我正在尝试通过 TLS 设置 WebSocket。
为此,我将按照下一本书第 81 页的说明进行操作。
https://www.amazon.com/WebSocket-Client-Server-Communications-Andrew-Lombardi/dp/1449369278/ref=sr_1_1?keywords=websocket&qid=1581782142&sr=8-1
我按照书中所说的设置服务器代码。 一切都很好,但是证书有一些问题。
根据这本书,我应该采取四个步骤来设置证书
1. Generate a 2048 bit key.
openssl genrsa -des -passout pass:x -out server.pass.key 2048
2. Generate a passphrase free key.
openssl rsa -passin pass:x -in server.pass.key -out server.key
3. Generate csr from the private key.
openssl req -new -key server.key -out server.csr
4. Generate the certificate
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
当我运行第 1 步时出现错误
"UI_set_result:result too small .."
修复是here。
他基本上说要运行以下片段而不是第 1 步。
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key
看起来他正在跳过 .pass 部分。为此采取第 2 步。所以我不确定在修复之后我是否应该采取这一步。
我运行这四个步骤,然后在 server.js 中我有:
var connection=
ssl:true,
port:port_number_here,
ssl_key:'server.key',
ssl_cert:'server.crt'
//..
var processRequest=function(req,res)
res.writeHead(200);
res.end("Hi!\n");
//console.log('connecting');
;
var app=null;
app = httpsServ.createServer(
key: fs.readFileSync(connection.ssl_key),
cert:fs.readFileSync(connection.ssl_cert)
,processRequest).listen(connection.port);
var wss = new WebSocketServer(server:app);
var clients=[];
var client_number=0;
wss.on('connection', function(cclient_socket)
console.log('Estabished Connection with client.');
然后我启动服务器:
node server.js
但是当我通过 Firefox 运行客户端代码时出现错误:
Firefox can’t establish a connection to the server at wss://somedomain:someportnumber/.
在 Chromium 中我得到错误:
(index):9 WebSocket connection to 'wss://thedomain.org:theportnumber/'
failed: Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID
我不确定如何从这里开始。 我猜我不知何故没有正确制作证书,但这个错误并没有给我太多的工作。
任何帮助将不胜感激。
附言我尝试执行以下指示,但无济于事。
https://***.com/a/41366949/322537
另外,我怀疑 Chromium 错误“ERR_CERT_AUTHORITY_INVALID”在这里很关键。我用谷歌搜索并发现 https://www.guildcafe.com/fix-net-err_cert_authority_invalid-error.html 它与证书颁发机构有关。这就是我。我仍然被困,因为我不知道如何解决它。
【问题讨论】:
我对连接对象的猜测 ssl 密钥和 ssl 证书应该从文件系统加载,例如 fs.readFileSynch 我就是这样,我更新了问题。 从这里我只看到了一个安全的http服务器,但是我没有看到websocket组件,你假设将它绑定到http服务器 ***.com/questions/6599470/node-js-socket-io-with-ssl 我添加了 wss 部分,你说的是这个吗? 【参考方案1】:解决方案是不创建书中描述的证书,而是简单地引用已经为给定网站创建的 ssl 证书。
【讨论】:
【参考方案2】:在我看来,您使用的是自签名服务器证书。你必须告诉你的客户——你的 Chromium 实例——在它使用 websocket 连接到你正在开发的服务器之前信任该密钥。您可以通过甜言蜜语让您的浏览器接受签名错误的 https 网页连接,而不是 websocket 连接。
在 Chromium 的情况下,您实际上需要告诉您机器的操作系统(不是服务器机器,而是您运行 Chromium 的机器)。请为您的操作系统查找这些说明。您正在查找“在 Ubuntu 上的 Chrome 中信任自签名证书”或“.. 在 MacOS 上”或“...在 Windows 上”或其他任何内容。
为此,Firefox 有自己的 UI。您也可以阅读相关内容。这可能是您通往成功的捷径。
然后是 Let's Encrypt,您可以使用它免费制作受信任的证书。如需教程,请查看此内容。 https://itnext.io/node-express-letsencrypt-generate-a-free-ssl-certificate-and-run-an-https-server-in-5-minutes-a730fbe528ca
我们玩得开心吗?我们是吗?我们是吗?
【讨论】:
我的想法是设置它,以便任何浏览器都可以连接而无需任何特殊设置。这不是 Websockets 提供的吗?有什么可以提供的吗? 我已经在为网站证书使用letsencrypt。我应该参考 server.js 代码中的网站证书吗?在这种情况下,.key 适合哪里? 是的,我们玩得很开心。路由器配置和证书设置技术问题是存在的原因。以上是关于WebSocket TLS 证书设置乐趣的主要内容,如果未能解决你的问题,请参考以下文章
mqtt使用WebSocket over TLS(wss)握手失败
websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503