2017-04-05 162 views
5

我已經獲得SSL證書用於簽署客戶端請求以及相關的CA證書。我可以使用openssl驗證它:nodejs ssl「無法獲得本地發行者證書」

$ openssl s_client -CAfile /etc/ssl/foo/ca-combined.pem -servername foo.co.in -connect foo.co.in:443 
CONNECTED(00000003) 
... snip ... 
Verify return code: 0 (ok) 
--- 
closed 

(我將2個CA證書合併爲一個文件)。但是,當我嘗試使用節點複製它:

var tls = require('tls'); 
    var fs = require('fs'); 

    var options = { 
     host: 'foo.co.in', 
     servername: 'foo.co.in', 
     port: 443, 
     key: fs.readFileSync('/etc/ssl/private/foo.key'), 
     cert: fs.readFileSync('/etc/ssl/foo/cert.pem'), 
     ca: [fs.readFileSync('/etc/ssl/foo/combined-ca.pem')] 
    }; 

    tls.connect(options, function(err) { 
     done(err); 
    }); 

我得到一個錯誤:

Uncaught Error: unable to get local issuer certificate 
    at Error (native) 
    at TLSSocket.<anonymous> (_tls_wrap.js:1092:38) 
    at TLSSocket._finishInit (_tls_wrap.js:610:8) 
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38) 

我發現這裏的答案,提示我需要把每個CA證書在一個單獨的文件:

ca: [fs.readFileSync('/etc/ssl/foo/ca.pem'), fs.readFileSync('/etc/ssl/foo/root-ca.pem')] 

但這仍然給出了同樣的錯誤。 (我也嘗試顛倒了順序)。然後,我嘗試將中間證書與客戶端證書放在一起,並提供根CA證書作爲ca(這似乎是docs建議的內容),同樣的錯誤。在這一點上,我正在用盡想法。 openssl開心的事實表明我做錯了什麼,有什麼建議嗎?

$ node --version 
v6.10.1 

(我知道我可以設置rejectUnauthorized到假的,但我真的不想)

+0

你正在使用哪個後端服務器? nginx,apache還是別的? –

+0

這是超出我的控制。我給了他們一個CSR,他們爲我生成了一個客戶證書,並給了我CA證書 – grahamrhay

回答

2

證明,我並不需要提供CA證書,作爲他們的CA被恰當地簽署一個「已知」權威。所以我可以從我的請求中刪除ca字段。

+0

謝謝!同樣的問題在這裏,你爲我節省了很多時間:) –

+0

你在這裏也發佈了https://github.com/nodejs/help/issues/566 –

1

我創建了一個root-ca和一箇中間ca(由root-ca簽名)證書,然後我創建了一個服務器和由intermediate-ca簽名的客戶端證書。爲了測試它,我已經實現與一的NodeJS服務器和客戶端的https所以設置它與證書和讓我的客戶端上出現以下錯誤:

problem with request: unable to get local issuer certificate 

爲了解決它,我需要把我的NodeJS代碼,在ca字段,我的root-ca和intermediate-ca證書。像這樣:

key: fs.readFileSync('path/client.privkey.pem'), 
cert: fs.readFileSync('path/client.cert.pem'), 
ca: [ fs.readFileSync('path/intermed-ca.cert.pem'), fs.readFileSync('path/root-ca.cert.pem') ], 

它適合我。

相關問題