javascript - 使用 Node 的加密库创建自签名证书?

标签 javascript node.js cryptography ssl-certificate

是否可以在纯 JavaScript(无 openssl 二进制文件)中使用 Node 的加密库生成自签名证书?这是我使用 openssl 生成证书的脚本:

#!/bin/bash
FQDN="*"

# Create a private key
openssl genrsa \
    -out server-key.pem \
    2048

# Create a certificate signing request
openssl req \
    -new \
    -key server-key.pem \
    -out certificate-signing-request.csr \
    -subj "/C=US/ST=StateL=City/O=Full Name/CN=${FQDN}"

# Sign the certificate signing request to create the server certificate
openssl x509 \
    -req -in certificate-signing-request.csr \
    -signkey server-key.pem \
    -out server-certificate.pem \
    -days 36159

我很好奇是否可以使用 JavaScript 以及此处提供的类和方法来完成这一切:

https://nodejs.org/api/crypto.html

如果是这样,上面创建文件的代码是什么样的?

最佳答案

您不能使用 Node 的 crypto 生成证书,从他们的 API 文档中没有任何创建证书的函数(他们建议使用 openSSL)。您当然可以签署证书,但这需要外部操作。

如果您想要一个在 JS 中完成所有操作的解决方案(@robertklep 也建议),您可以使用 JavaScript 中的 native 实现,例如 Forge .

在此代码示例中,您创建了一个证书,对其进行自签名并以 PEM 格式导出。 Forge 拥有您需要的一切,因此 crypto 不是必需的

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

// generate a keypair or use one you have already
var keys = pki.rsa.generateKeyPair(2048);

// create a new certificate
var cert = pki.createCertificate();

// fill the required fields
cert.publicKey = keys.publicKey;
cert.serialNumber = '01';
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);

// use your own attributes here, or supply a csr (check the docs)
var attrs = [{
  name: 'commonName',
  value: 'example.org'
}, {
  name: 'countryName',
  value: 'US'
}, {
  shortName: 'ST',
  value: 'Virginia'
}, {
  name: 'localityName',
  value: 'Blacksburg'
}, {
  name: 'organizationName',
  value: 'Test'
}, {
  shortName: 'OU',
  value: 'Test'
}];

// here we set subject and issuer as the same one
cert.setSubject(attrs);
cert.setIssuer(attrs);

// the actual certificate signing
cert.sign(keys.privateKey);

// now convert the Forge certificate to PEM format
var pem = pki.certificateToPem(cert);
console.log(pem);

该过程非常简单,所需代码量相对较少。 forge readme列出所有其他选项,例如为属性和扩展提供 csr 而不是在代码中全部完成。

关于javascript - 使用 Node 的加密库创建自签名证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624143/

相关文章:

javascript - socket.io:客户端发出回调永远不会触发

node.js - 尝试使用 REST API 创建问题时,Bitbucket API 始终返回 400

hash - 在 Erlang 中将数据 block 签名为哈希不起作用。基于ec的 key 推导

javascript - 根据获取响应快速填充数组

c# - 如何使用 Rfc2898DeriveBytes 解密以下函数字符串?

pdf - 如何在 Java 中对 PDF(或其他文档)进行数字签名?

javascript - 可拖动 div 中的位置错误

javascript - 在基于 javascript 的 Canvas 游戏上上下移动

javascript - 如何在 jQuery 中模拟无限数量的元素

php - 如何强制用户授予页面选项卡应用程序的扩展权限?