我正在编写代理支持HTTPS-HTTPS代理。在我使用Python作为主要编程语言之前,我现在对node.js感兴趣,所以我准备迁移。
我面临的最大问题是我不知道如何在node.js中生成CA和其他服务器证书。在Python中,有一个很棒的pyOpenSSL。到目前为止,我在node.js中找不到类似的内容。
也许我应该使用openssl-fork方法?但是如何在openssl中处理交互操作。
谢谢。
答案 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命令。
答案 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')
}
依赖项:
答案 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/