1
所以我想在node.js的TLS连接中拥有一个非CA证书作为根证书。然而,证书似乎总是被视为一个CA.如何在node.js中使用非CA SSL证书作为根证书?
我生成与
openssl req -new -nodes -subj "/CN=ClientName1" -keyout client-key.pem -out client-csr.pem
openssl x509 -req -signkey client-key.pem -in client-csr.pem -out client-cert.pem -extfile v3.ext
的根证书(类似于用于服务器)
和测试证书这样
openssl req -new -nodes -subj "/CN=ClientName2" -keyout client-key2.pem -out client-csr2.pem
openssl x509 -req -in client-csr2.pem -out client-cert2.pem -extfile v3.ext -CA client-cert.pem -CAkey client-key.pem -CAcreateserial
与v3.ext是
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
现在服务器接受客户端证书以及客户端证书2,但是,如果我生成由客户端证书2签名的第三个(客户端 - 证书3),服务器不接受它。因此,无论如何,根证书似乎都被视为CA。有没有办法绕过它而不是故意生成一次性虚拟根证书,它只用于签署一个客户端证书?
我使用它是这样的:
var options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
requestCert: true,
rejectUnauthorized: true,
ca: [fs.readFileSync('client-cert.pem')],
port: 15151
};
var server = tls.createServer(options, function (socket) {});
附:另外,当测试以root身份使用client-cert2.pem时,服务器不接受使用client-cert2,client-cert3和client-cert的客户端。
我在想basicConstraints = CA:FALSE会这样做。我还有什么限制使用不允许通过生成的证书进行签名? – Marius
@Marius:证书由客户验证。服务器接受什么并不重要,因为它只将证书发送给客户端。 –
是的,我知道,但客户端接受自签名根证书,当且仅当它具有keyCertSign标志设置。也许我的例子不是最好的,因为我使用双向身份验证(服务器和客户端都向另一方提供证书),在我的示例中,服务器拒绝客户端证书或将其作为具有keyCertSign特权的CA接受。但问题是相同的:根或者必须有keyCertSign,给它比我想要的更多的特权,或者它不会被自己拒绝。 – Marius