Node.js:访问客户端证书

时间:2015-05-12 15:24:27

标签: node.js ssl

我正在开发一个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中获得的此客户端证书向另一台名为“server 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中所述,必须为cert参数提供以下数据:

  

要使用的公共x509证书。默认为null。

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

1 个答案:

答案 0 :(得分:4)

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

证书对象有一个raw字段,其中包含您想要的字节形式的证书数据。要以X509格式获取它,只需将其转换为base64。因此,您正在寻找的代码是:

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

希望有所帮助!