我正在开发一个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);
});
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,以下代码打印客户端证书的详细信息.
app.get('/', function (req, res) {
/*** Dump ***/
res.contentType('application/json');
res.send(util.inspect(req.socket.getPeerCertificate(true), {colors: true}));
});
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够使用在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);
});
});
Run Code Online (Sandbox Code Playgroud)
问题是我没有找到使用getPeerCertificate函数获取正确的X509证书的方法,该函数返回证书的"自定义"对象表示.如官方文档中所述,cert参数必须提供以下数据:
公共x509证书使用.默认为null.
有没有办法以正确的格式获取客户端证书?
小智 6
我遇到了同样的问题,看到您的问题没有答案,所以我回来发表我的解决方案。
证书对象具有一个raw字段,该字段包含所需字节格式的证书数据。要以X509格式获取它,只需将其转换为base64。因此,您要查找的代码是:
req.socket.getPeerCertificate(true).raw.toString('base64');
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
| 归档时间: |
|
| 查看次数: |
4195 次 |
| 最近记录: |