【问题标题】:Can nodejs generate SSL certificates?nodejs可以生成SSL证书吗?
【发布时间】:2012-03-20 03:41:54
【问题描述】:

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

我面临的最大问题是我不知道如何在 node.js 中生成 CA 和其他服务器证书。在 Python 中,有很棒的 pyOpenSSL。直到现在我在 node.js 中还没有找到类似的东西。

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

谢谢。

【问题讨论】:

    标签: node.js openssl


    【解决方案1】:

    有一个名为“Jsrsasign”的纯 JavaScript 库来生成 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/

    【讨论】:

      【解决方案2】:

      似乎没有一个节点库支持我需要的选项,所以我使用了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 可执行文件
      • 纱线添加温度

      【讨论】:

      • 这段代码似乎不完整...ssl/my.csr、ssl/root-ca.pem等是什么?如何生成它们?为什么不在答案中包含生成它们的代码?
      【解决方案3】:

      如果有人确实想以编程方式从 node.js 创建 CSR,我有 created a nodejs module,它使用 openssl 创建私钥和 CSR。

      编辑:改用pem。它更完整,可能更可靠。

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

      【讨论】:

      • 我的模块现在完全被弃用了。我只是发布它,因为我不知道 pem:npmjs.org/package/pem
      • pem 只是产生 openssl。
      • @andrewrk 这是一件好事。除了 heartbleed(从未直接影响节点)等备受瞩目的漏洞,请尽可能保持安全和加密代码的隔离和 DRY。
      • @DavidSouther 节点实际上链接到 OpenSSL 库的一个分支,通常比托管系统上的版本更新。
      • node-forge 是救生员!据我所知,如果您还需要 Windows 支持,这是唯一的选择。
      【解决方案4】:

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

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

      【讨论】:

      • 这个很棒。最重要的是,它不依赖于“open-ssl”
      • 我也将它用于生产代码,它就像一个魅力。
      【解决方案5】:

      使用 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());
      });
      

      我会对反馈感兴趣。 ;)

      【讨论】:

      • 我认为将这些 shell 脚本包装在 exec 函数和 spawn 函数中并使用它而不是整个库
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多