笔记记录:NodeJS生成本地证书

文章介绍了如何使用node-forge库在Node.js环境中替代openssl生成证书和私钥。node-forge是一个纯JavaScript库,允许开发者在代码中直接创建证书和私钥,避免了依赖外部命令行工具和处理平台兼容性问题。示例代码展示了如何生成RSA密钥对,创建自签名X.509证书,并将其保存为PEM格式。
摘要由CSDN通过智能技术生成

使用node-forge生成证书和私钥的方式可以替换openssl生成证书和私钥的方式。node-forge是一个纯JavaScript库,可以在Node.js环境中使用,提供了生成证书和私钥的功能。而openssl是一个独立的命令行工具,用于处理各种加密相关的任务,包括生成证书和私钥。

在某些情况下,使用node-forge可能更方便,因为您可以直接在Node.js代码中生成证书和私钥,而无需依赖外部命令行工具。此外,node-forge可以在不同平台上提供一致的功能,而无需考虑openssl在不同系统上的安装和配置问题。

安装node-forge

npm i node-forge
const forge = require('node-forge');
const fs = require('fs');

const createSelfSignedCert = () => {
  // 生成RSA密钥对,密钥长度为2048位
  const keys = forge.pki.rsa.generateKeyPair(2048);
  // 创建一个新的X.509证书
  const cert = forge.pki.createCertificate();
  // 将公钥设置为生成的公钥
  cert.publicKey = keys.publicKey;
  // 设置证书的序列号
  cert.serialNumber = '01';

  // 设置证书的有效期,从当前时间开始,有效期为1年
  cert.validity.notBefore = new Date();
  cert.validity.notAfter = new Date();
  cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);

  // 定义证书的主题属性,包括通用名称、国家名称、州/省名称、地区名称、组织名称等
  const attrs = [
    { name: 'commonName', value: 'localhost' },
    { name: 'countryName', value: 'US' },
    { shortName: 'ST', value: 'California' },
    { name: 'localityName', value: 'San Francisco' },
    { name: 'organizationName', value: 'My Company' },
    { shortName: 'OU', value: 'My Company' }
  ];

  // 设置证书的主题和颁发者属性
  cert.setSubject(attrs);
  cert.setIssuer(attrs);

  // 设置证书的扩展属性,如基本约束、密钥用途、扩展密钥用途等
  cert.setExtensions([
    {
      name: 'basicConstraints',
      cA: true
    },
    {
      name: 'keyUsage',
      keyCertSign: true,
      digitalSignature: true,
      nonRepudiation: true,
      keyEncipherment: true,
      dataEncipherment: true
    },
    {
      name: 'extKeyUsage',
      serverAuth: true,
      clientAuth: true,
      codeSigning: true,
      emailProtection: true,
      timeStamping: true
    },
    {
      name: 'nsCertType',
      client: true,
      server: true,
      email: true,
      objsign: true,
      sslCA: true,
      emailCA: true,
      objCA: true
    }
  ]);

  // 使用生成的私钥自签名证书
  cert.sign(keys.privateKey);

  // 将生成的私钥和证书转换为PEM格式
  const pem = {
    privateKey: forge.pki.privateKeyToPem(keys.privateKey),
    certificate: forge.pki.certificateToPem(cert)
  };

  // 将生成的证书转换为DER格式
  const derCert = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes();

  // 返回PEM格式的私钥和DER格式的证书
  return { pem, derCert };
}

// 将PEM格式的私钥和DER格式的证书写入本地文件
const saveCertFiles = (pem, derCert) => {
  fs.writeFileSync('privateKey.pem', pem.privateKey);
  fs.writeFileSync('certificate.pem', pem.certificate);
  fs.writeFileSync('certificate.crt', derCert, 'binary');
}

const { pem, derCert } = createSelfSignedCert();
saveCertFiles(pem, derCert);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值