我正在尝试使用带有自签名证书的 Node.js 0.8.8 创建 TLS 服务器/客户端设置。
基本的服务器代码看起来像
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。TLS模块的文档暗示将服务器证书添加到ca
数组中就足够了,然后一切都应该没问题。
如果我这样做,这个错误就消失了,但我得到了一个新的:
Hostname/IP doesn't match certificate's altnames
对我来说,这意味着 CA 现在基本上是受信任的,因此现在没关系,但是证书是为我使用的另一台主机制作的。
我使用创建了证书
$ openssl genrsa -out server-key.pem 2048
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
正如文档所暗示的那样。在创建 CSR 时,我会被问到一些常见的问题,例如国家、州、... 和通用名称 (CN)。正如您在“网络上”被告知的 SSL 证书一样,您没有提供您的 CN 名称,而是您想要使用的主机名。
这可能是我失败的地方。
我试过
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
其中最后两个是我的机器的本地名称和完全限定的本地名称。
知道我在这里做错了什么吗?