所以我想在 node.js 的 TLS 连接中使用非 CA 证书作为根证书。然而,该证书似乎总是被视为 CA。
我正在生成根证书
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
现在服务器接受 client-cert 和 client-cert2,但是如果我生成由 client-cert2 签名的第三个 (client-cert3),服务器不接受它。因此,无论如何,根证书似乎都被视为 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 的客户端。
任何用于签署另一个证书的东西都必须有适当的 key 使用限制。如果使用限制不允许证书用作 CA,则您无法绕过它,因为证书链的验证是由客户端而不是服务器完成的。
我是一名优秀的程序员,十分优秀!