nodejs可以生成SSL证书吗?

Posted

技术标签:

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

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

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

也许我应该使用 openssl-fork 方法?但是如何处理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.csrssl/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 函数中并使用它而不是整个库

以上是关于nodejs可以生成SSL证书吗?的主要内容,如果未能解决你的问题,请参考以下文章

jdk自带keytool生成ssl证书安全吗

haproxy服务器本身只提供代理,没有ssl证书吗?

用nodejs快速实现websocket服务端(带SSL证书生成)

SSL证书智能管理系统能发现我的证书安全漏洞吗?

k8s-ssl证书安装

sh 笔记:OpenSSL生成「自签名」证书,配置Nodejs本地HTTPS服务 - 7.通过macOS下的keychian.app打开ssl.crt