我正在开发一个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。
有没有办法以正确的格式获取客户端证书?
答案 0 :(得分:4)
我遇到了同样的问题,没有回答就看到了你的问题,所以我回来发布我的解决方案。
证书对象有一个raw
字段,其中包含您想要的字节形式的证书数据。要以X509格式获取它,只需将其转换为base64。因此,您正在寻找的代码是:
req.socket.getPeerCertificate(true).raw.toString('base64');
希望有所帮助!