2015-10-18 81 views
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的客户端。

回答

0

用于签署另一证书的任何内容都必须具有适当的密钥使用限制。如果使用限制不允许证书作为CA使用,则无法解决该问题,因为证书链的验证是由客户端而不是由服务器完成的。

+0

我在想basicConstraints = CA:FALSE会这样做。我还有什么限制使用不允许通过生成的证书进行签名? – Marius

+0

@Marius:证书由客户验证。服务器接受什么并不重要,因为它只将证书发送给客户端。 –

+0

是的,我知道,但客户端接受自签名根证书,当且仅当它具有keyCertSign标志设置。也许我的例子不是最好的,因为我使用双向身份验证(服务器和客户端都向另一方提供证书),在我的示例中,服务器拒绝客户端证书或将其作为具有keyCertSign特权的CA接受。但问题是相同的:根或者必须有keyCertSign,给它比我想要的更多的特权,或者它不会被自己拒绝。 – Marius