nodejs可以生成SSL证书吗?

时间:2012-03-01 16:11:12

标签: node.js openssl

我正在编写代理支持HTTPS-HTTPS代理。在我使用Python作为主要编程语言之前,我现在对node.js感兴趣,所以我准备迁移。

我面临的最大问题是我不知道如何在node.js中生成CA和其他服务器证书。在Python中,有一个很棒的pyOpenSSL。到目前为止,我在node.js中找不到类似的内容。

也许我应该使用openssl-fork方法?但是如何在openssl中处理交互操作。

谢谢。

5 个答案:

答案 0 :(得分:33)

将shell用于证书:

openssl genrsa -out server-key.pem 1024
openssl req -new -key server-key.pem -out server-csr.pem
openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem

然后在node.js中使用它们

var https = require('https');
https.createServer({
    key: fs.readFileSync('server-key.pem'),
    cert: fs.readFileSync('server-cert.pem')
},
function (req,res) {
      ... 
})

修改

您也可以在NPM中尝试这个项目: https://npmjs.org/package/openssl-wrapper

我发现它正在搜索NPM回购:https://npmjs.org/search?q=openssl

我自己没有尝试或检查过,但它看起来像是一种使用节点生成证书的方法,这是原始问题。

var openssl = require('openssl-wrapper');
var password = 'github';

return openssl.exec('genrsa', {des3: true, passout: 'pass:' + password, '2048': false}, function(err, buffer) {
    console.log(buffer.toString());
});

我会对反馈感兴趣。 ;)

答案 1 :(得分:23)

如果某人 希望以编程方式从node.js创建CSR,我created a nodejs module使用openssl来创建私钥和CSR。

修改:改为使用pem。它更完整,可能更可靠。

Edit2:实际上,pem也只是openssh上的一个简单包装器。对于纯js实现,请查看forge

答案 2 :(得分:8)

node-forge允许这样做。没什么好说的。不要在内部使用openssl shell命令。

https://github.com/digitalbazaar/forge#x509

答案 3 :(得分:0)

似乎所有节点库都不支持我需要的选项,因此我使用openssl可执行文件。

import { execSync } from 'child_process'
import fs from 'fs'
import tempy from 'tempy'

const extHeader = `authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
`
const shell = cmd => execSync(cmd, { stdio: 'pipe' })

const writeCert = (extFile, outfile) => {
  const cmd = [
    `openssl`,
    `x509`,
    `-req`,
    `-in ssl/my.csr`,
    `-CA ssl/root-ca.pem`,
    `-CAkey ssl/root-ca.key`,
    `-CAserial ssl/root-ca.srl`,
    `-out ssl/${outfile}`,
    `-days 1825`,
    `-sha256`,
    `-extfile ${extFile}`,
    `-passin pass:mypassphrase`
  ]
  shell(cmd.join(' '))
}

const createCert = domains => {
  const sans = domains.map((d, i) => `DNS.${i + 1} = ${d}`)
  const ext = extHeader + sans.join('\n')
  const extFile = tempy.file()
  fs.writeFileSync(extFile, ext, 'utf-8')
  writeCert(extFile, 'out.crt')
}

依赖项:

  • openssl可执行文件
  • 添加纱线节奏

答案 4 :(得分:0)

有一个纯JavaScript库,名为“ Jsrsasign”,用于生成CSR证书。

const r = require("jsrsasign");
const kp = r.KEYUTIL.generateKeypair("RSA", 2048);
const csr = r.KJUR.asn1.csr.CSRUtil.newCSRPEM({
 subject: {},
 sbjpubkey: kp.pubKeyObj,
 sigalg: "SHA256withRSA",
 sbjprvkey: kp.prvKeyObj,
});
const privateKey = r.KEYUTIL.getPEM(kp.prvKeyObj, "PKCS1PRV");

有关更多文档,请访问http://kjur.github.io/jsrsasign/