node.js - WebSocket TLS 证书设置乐趣
问题描述
我正在尝试通过 TLS 设置 WebSocket。
为此,我将按照下一本书第 81 页的说明进行操作。
我按照他们在书中所说的那样设置服务器代码。那里都很好,但是证书有一些问题。
根据这本书,我应该采取四个步骤来设置证书
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 它与证书颁发机构有关。这就是我。我仍然被困,因为我不知道如何解决它。
解决方案
在我看来,您使用的是自签名服务器证书。你必须告诉你的客户——你的 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
我们刚才玩的高兴吗?我们是吗?我们是吗?
推荐阅读
- reactjs - 对鼠标滚动做出反应状态变化
- php - 联系表格不起作用,使用 AJAX、PHP 和 HTML5 制作
- python - 在一个数组中找到相同的值,在另一个数组中找到它的等价对
- python-3.x - 将数字列表列表转换为列表列表,其中数字用逗号分隔
- javascript - 如何在 YouTube Api 上实现分页?
- php - 通过php上传到onedrive的文件为空
- c++ - #define 宏不符合预期
- json - 如何在 Flutter 中使用 json 或其他内容保存我当前的状态
- ruby-on-rails - Ruby on Rails:控制器操作无法显示通知警报
- python - 如何根据条件获取每一行的上一个事件