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 证书设置乐趣的主要内容,如果未能解决你的问题,请参考以下文章

将 WebSocket 升级到 TLS

mqtt使用WebSocket over TLS(wss)握手失败

NodeJS 中的客户端 websocket 证书

websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503

将客户端证书与 WebSocket4Net 一起使用

创建TLS证书和秘钥