2015-10-18 150 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