2015-05-12 108 views
3

我正在研究一個Node.js應用程序,我們將其稱爲「服務器A」,其中用戶必須提供客戶端證書才能訪問服務。Node.js:訪問客戶端證書

簡單的例子:

/** server setup **/ 
var serverOptions = { 
    key: fs.readFileSync('certs/server.key'), 
    cert: fs.readFileSync('certs/server.crt'), 
    ca: [fs.readFileSync('certs/ca.crt'), fs.readFileSync('certs/bar.cer'), fs.readFileSync('certs/foo.cer')], 
    requestCert: true 
}; 

https.createServer(serverOptions, app).listen(SERVER_PORT, '', null, function() { 
    var host = this.address().address; 
    var port = this.address().port; 

    console.log('listening at http://%s:%s', host, port); 
}); 

一切正常,下面的代碼打印客戶端證書的詳細信息。

app.get('/', function (req, res) { 

    /*** Dump ***/ 
    res.contentType('application/json'); 
    res.send(util.inspect(req.socket.getPeerCertificate(true), {colors: true})); 

}); 

不過,我想能夠使用在serverA的獲得該客戶端證書,作出所謂的「服務器B」的另一臺服務器的請求。

options = { 
    hostname: 'localhost', 
    port: '3010', 
    path: '/', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'text/xml;charset=UTF-8', 
     'Content-Length': serverResponse.length, 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    }, 
    cert: clientCertificate 
}; 

var req = https.request(options, function (res) { 

    console.log('statusCode: ', res.statusCode); 
    console.log('headers: ', res.headers); 

    res.on('data', function(d) { 
     callback(d); 
    }); 
}); 

的問題是,我還沒有找到一種方式來獲得與getPeerCertificate函數,返回證書的「定製」對象表示正確的X509證書。 如official documentation描述的,證書參數必須被提供有如下的數據:

公共X509證書使用。默認爲空。

有沒有辦法以正確的格式獲取客戶端證書?

回答

2

我有同樣的問題,看到你的問題沒有答案,所以我回來發佈我的解決方案。

證書對象有一個raw字段,它包含所需的字節形式的證書數據。要獲得它在X509格式,只需將其轉換爲base64。所以你要找的代碼是:

req.socket.getPeerCertificate(true).raw.toString('base64'); 

希望有所幫助!

+0

它幫助!謝謝Hussain – Konal