所以我希望在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的客户端。
答案 0 :(得分:0)
用于签署其他证书的任何内容都必须具有相应的密钥使用限制。如果使用限制不允许证书作为CA工作,则无法解决它,因为证书链的验证是由客户端完成的,而不是由服务器完成的。