首页 > 解决方案 > WebSocket TLS 证书设置乐趣

问题描述

我正在尝试通过 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 .." 

解决方法在这里

他基本上说要运行以下片段而不是第 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

我不确定如何从这里开始。我猜我不知何故没有正确制作证书,但这个错误并没有给我太多的工作。

任何帮助,将不胜感激。

ps 我尝试执行以下指示,但无济于事。

https://stackoverflow.com/a/41366949/322537

另外,我怀疑 Chromium 错误“ERR_CERT_AUTHORITY_INVALID”是这里的关键。我用谷歌搜索了它,发现 https://www.guildcafe.com/fix-net-err_cert_authority_invalid-error.html 它与证书颁发机构有关。这就是我。我仍然被困,因为我不知道如何解决它。

标签: node.jssslwebsocketssl-certificate

解决方案


在我看来,您使用的是自签名服务器证书。你必须告诉你的客户——你的 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

我们刚才玩的高兴吗?我们是吗?我们是吗?


推荐阅读