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

时间:2015-10-18 14:41:20

标签: node.js ssl openssl

所以我希望在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的客户端。

1 个答案:

答案 0 :(得分:0)

用于签署其他证书的任何内容都必须具有相应的密钥使用限制。如果使用限制不允许证书作为CA工作,则无法解决它,因为证书链的验证是由客户端完成的,而不是由服务器完成的。