首页 > 解决方案 > 如何使用 NodeJS 从 PEM 文件中提取主题

问题描述

我正在尝试使用 NodeJS 从 PEM 格式中提取证书的主题名称,标准格式应类似于“C=US, ST=California, L=San Francisco, O=Wikimedia Foundation, Inc., CN=*.wikipedia.org"

我可以使用 x509-package ( https://www.npmjs.com/package/x509 ) 提取主题名称,然后使用命令

var subject = x509.getSubject(pem_cert);

但是,这会将其格式化为

{ commonName: '*.wikipedia.org',
  serialNumber: 'some_number',
  countryName: 'US' 
}

我需要格式等于标准格式,是否有具有特定输出的 NodeJS 包或命令?

标签: node.jsx509certificate

解决方案


您可以使用node-forge获取所需格式的证书主题

const pki = require('node-forge').pki;


const certPem = `
-----BEGIN CERTIFICATE-----
your certificate here
-----END CERTIFICATE-----
`;

const cert = pki.certificateFromPem(certPem);
const subject = cert.subject.attributes
  .map(attr => [attr.shortName, attr.value].join('='))
  .join(', ');

console.log(subject); // "C=US, ST=California, ..."

如果您在运行 Node.js 的操作系统上有可用的openssl命令行实用程序,您也可以调用它来获取主题字符串:

const { spawn } = require('child_process');


const certPem = `
-----BEGIN CERTIFICATE-----
your certificate here
-----END CERTIFICATE-----
`;

const child = spawn('openssl', ['x509', '-subject', '-noout']);

child.stdin.write(certPem);

let data = '';
child.stdout.setEncoding('utf-8');
child.stdout.on('data', (chunk) => {
  data += chunk
});

child.on('close', () => {
  const subject = data.replace(/^subject=/, '');
  console.log(subject);
});

child.stdin.end();

推荐阅读