我已经在 Node.js 中创建了一个 TLS 服务器和一个合适的 TLS 客户端。显然他们都相互合作,但我想验证一下。
基本上,我想到的是检查连接,或手动连接到服务器并检查它发送的内容,或类似的东西......
服务器相关代码为:
var tlsOptions = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('server.pem')
};
tls.createServer(tlsOptions, function (tlsConnection) {
var d = dnode({
// [...]
});
tlsConnection.pipe(d).pipe(tlsConnection);
}).listen(3000);
适当的客户端代码是:
var d = dnode();
d.on('remote', function (remote) {
// [...]
});
var tlsConnection = tls.connect({
host: '192.168.178.31',
port: 3000
});
tlsConnection.pipe(d).pipe(tlsConnection);
我该怎么做?
最佳答案
Wireshark 会告诉您数据是否经过 TLS 加密,但它不会告诉您连接是否真的安全以防止中间人攻击。为此,您需要测试您的客户端是否拒绝连接到提供未由受信任 CA 签名的证书的服务器、仅对不同主机名有效的证书、不再有效的证书、已吊销的证书……
如果您的 server.pem 不是来自真实/可信 CA 的证书,并且您的客户端不拒绝连接到服务器(并且您没有明确向客户端提供 server.pem),那么您的客户端很可能是不安全的。鉴于您正在连接到 IP 而不是主机名,任何受信任的 CA 都不应该为其颁发证书,因此我假设您使用的是自签名证书并且容易受到攻击。您可能需要在 connect()
时指定 rejectUnauthorized
。 (Rant: 由于这是一个很常见的错误,我认为默认不验证是极不负责任的。)
关于node.js - 如何验证连接实际上是否受 TLS 保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14085444/