node.js 如何使用非 CA SSL 证书作为根证书?

How to use non-CA SSL certificate as root certificate in node.js?

所以我想在 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) {});

P.S。此外,在测试以 root 身份使用 client-cert2.pem 时,服务器不接受使用 client-cert2、client-cert3 或 client-cert.

的客户端

任何用于签署另一个证书的东西都必须有适当的密钥使用限制。如果使用限制不允许证书用作 CA,则您无法绕过它,因为证书链的验证是由客户端而不是服务器完成的。