最近我一直在尝试制作一个基本的 TLC 服务器和客户端,以便安装在 Rasperry PI 上。我在github上找到了一个示例,并对其进行了修改,使其保持最新状态。我的问题是 Node JS 一直在说unable to verify the first certificate
即使我生成了一个新的。
请注意证书和密钥是自签名的。
这是我的代码,我对它失败的原因一无所知,因为当我设置ServerOptions
为客户端选项时,它只会记录Unsecure connection.
服务器.js
'use strict';
const tls = require('tls');
const fs = require('fs');
const util = require('util');
const events = require('events');
const port = 4170;
const ServerOptions = {
key: fs.readFileSync('agent1-key.pem'),
cert: fs.readFileSync('agent1-cert.pem'),
ca: fs.readFileSync('root-cert.pem'), // authority chain for the clients
requestCert: true,
rejectUnauthorized: false
};
var server = tls.createServer(ServerOptions, (socket) => {
socket.write('welcome!\n');
socket.setEncoding('utf8');
socket.pipe(socket);
})
.on('connection', function(c) {
console.log('Unsecure connection');
})
.on('secureConnect', function (c) {
// c.authorized will be true if the client cert presented validates with our CA
console.log('secure connection\n client authorization Status:', c);
})
.listen(port, function() {
console.log('server listening on port' + port + '\n');
});`
客户端.js
const tls = require('tls');
const fs = require('fs');
const util = require('util');
const events = require('events');
const port = 4170;
const ClientOptions = {
key: fs.readFileSync('agent2-key.pem'),
cert: fs.readFileSync('agent2-cert.pem'),
ca: fs.readFileSync('root-cert.pem')
};
const socket = tls.connect(port, ClientOptions, () => {
console.log('client connected', socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
console.log(data);
});
socket.on('end', () => {
server.close();
});
所以你可能看到了,有ca1-cert.pem
, agent1-cert.pem
, agent2-cert.pem
, agent1-key.pem
, 和agent2-key.pem
。那些是证书。
每个证书文件都有开头和结尾
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
并且每个关键文件都有开头和结尾
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
除此之外,我想知道这有多安全,因为我最初的计划是将其用作登录/数据库服务器或无法轻易入侵的东西。
谢谢你。
编辑 1
在评论中,有人说证书可能因为错误的 CA 文件而没有被验证。我将 CA 文件与“...-cert.pem”文件放在同一位置。我假设这不是问题,因为我和我的朋友谈过,他检查了证书和密钥文件并说它们都很好。