是否可以在纯 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/