我试图创建一个使用Node.js的0.8.8使用自签名证书的TLS服务器/客户端安装。主机名/ IP不匹配证书的备用名
基本服务器代码看起来像
var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);
现在,当我尝试连接到这台服务器我使用下面的代码:
var connection = tls.connect({
host: '192.168.178.31',
port: 3000,
rejectUnauthorized: true,
ca: [ fs.readFileSync('server-cert.pem') ]
}, function() {
console.log(connection.authorized);
console.log(connection.authorizationError);
console.log(connection.getPeerCertificate());
});
如果我删除线
ca: [ fs.readFileSync('server-cert.pem') ]
从客户端代码,Node.js的抛出一个错误告诉我DEPTH_ZERO_SELF_SIGNED_CERT
。据我了解,这是由于这是一个自签名证书,并且没有其他方信任此证书。
如果我删除
rejectUnauthorized: true,
为好,错误消失 - 但connection.authorized
等于false
这实际上意味着我的连接未加密。无论如何,使用getPeerCertificate()
我可以访问服务器发送的证书。由于我想执行加密连接,因此我明白我可能不会删除此行。
现在我读,我可以使用ca
属性来指定,我想Node.js的信任任何CA。该documentation of the TLS module意味着它足以服务器证书添加到ca
数组,然后一切都应该罚款。
如果我这样做,这个错误是走了,但我得到一个新问题:
Hostname/IP doesn't match certificate's altnames
对我来说,这意味着CA现在基本可信的,因此,现在没事,但证书被做对于另一台主机而不是我使用的主机。
我创建使用
的文档暗示的证书。在创建企业社会责任时,我会问到一些常见的问题,例如国家,州,......和通用名称(CN)。正如您在“网络上”所告诉您的SSL证书所做的那样,而不是会提供您的名称作为CN,但是您希望使用的主机名。
而这可能是我失败的地方。
我试图
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
其中最后两个是当地的名字和我的机器的完全合格的本地名称。
任何想法我在做什么错在这里?
重要提示:这是'Node v0.8.8'。 'rejectUnauthorized'现在默认为'true'。 – Breedly
如果您使用'rejectUnauthorized:false',则默认情况下您的连接[仍然是加密的](https://stackoverflow.com/a/16311147/4068278)。它根本不验证您连接的主机的身份,这可能会让您容易受到SSL上的MITM攻击。 –