【问题标题】:NodeJS and TLS, get client certificateNodeJS 和 TLS,获取客户端证书
【发布时间】:2019-05-02 11:19:59
【问题描述】:

我正在测试Node.JSTLS,并且正在创建一个简单的服务器和客户端。 这似乎工作正常:

server.js:

const tls = require('tls');
const fs = require('fs');

const options = {
  key: fs.readFileSync('./server-certs/server.key'),
  cert: fs.readFileSync('./server-certs/server.crt'),
  rejectUnauthorized: false,
  requestCert: true
};

const server = tls.createServer(options, (socket) => {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');

  console.log(socket.getPeerCertificate(true).raw);

  socket.write('welcome!\n');
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, () => {
  console.log('server bound');
});

client.js:

const tls = require('tls');
const fs = require('fs');

const options = {
  key: fs.readFileSync('./client-certs/client.key'),
  cert: fs.readFileSync('./client-certs/client.crt')
};

const socket = tls.connect(8000, options, () => {
  console.log('client connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  process.stdin.pipe(socket);
  process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
  console.log(data);
});
socket.on('end', () => {
  console.log('server ends connection');
});

使用server.js,我打印出客户端证书:

console.log(socket.getPeerCertificate(true).raw);

但是在 Linux 上执行 cat client.crt 我有以下长字符串:

-----BEGIN CERTIFICATE-----
MIICsDCCAZgCCQC8miOEYnXCXDANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQGEwJV
...
MHBcIlA2R3ssgfhlcSJcaR59LKA=
-----END CERTIFICATE-----

server.js 是否可以从客户端证书中获取该字符串?

【问题讨论】:

    标签: node.js ssl tls1.2


    【解决方案1】:
    console.log(socket.getPeerCertificate(true).raw);
    

    这将返回 DER 格式的证书。您在client.crt 中看到的是 PEM 格式的证书 - 它基本上是二进制 DER 格式的 base64,并添加了一些页眉和页脚行。您可以使用openssl x509 -in client.crt -outform der 将 PEM 转换为 DER。或者您可以按照NodeJS: Validate certificate in DER format 中的建议将 DER 格式的证书转换为 nodejs 中的 PEM。

    【讨论】:

    • var prefix = '-----BEGIN CERTIFICATE-----\n'; var postfix = '-----END CERTIFICATE-----'; var pemText = prefix + socket.getPeerCertificate(true).raw.toString('base64').match(/.{0,64}/g).join('\n') + postfix; 似乎有效,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多