Node.js:访问客户端证书

我正在研究一个Node.js应用程序,我们将其称为“服务器A”,用户必须提供客户端证书才能访问服务。

简单的例子:

/** 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); }); }); 

问题是,我还没有find一种方法来获得适当的X509证书与getPeerCertificate函数,该函数返回证书的“自定义”对象表示forms。 正如在官方文档中所描述的那样,cert参数必须提供以下数据:

公共x509证书使用。 默认为空。

有没有办法以正确的格式获得客户端证书?

我有同样的问题,看到你的问题没有答案,所以我回来发布我的解决scheme。

证书对象有一个raw字段,它包含所需的字节forms的证书数据。 要得到它在X509格式,只需将其转换为base64。 所以你正在寻找的代码是:

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

希望有所帮助!