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的客戶端。
我在想basicConstraints = CA:FALSE會這樣做。我還有什麼限制使用不允許通過生成的證書進行簽名? – Marius
@Marius:證書由客戶驗證。服務器接受什麼並不重要,因爲它只將證書發送給客戶端。 –
是的,我知道,但客戶端接受自簽名根證書,當且僅當它具有keyCertSign標誌設置。也許我的例子不是最好的,因爲我使用雙向身份驗證(服務器和客戶端都向另一方提供證書),在我的示例中,服務器拒絕客戶端證書或將其作爲具有keyCertSign特權的CA接受。但問題是相同的:根或者必須有keyCertSign,給它比我想要的更多的特權,或者它不會被自己拒絕。 – Marius