繁体   English   中英

NodeJS 从文件中加载 PFX 证书

[英]NodeJS load PFX certificate from file

我正在使用 Node.JS 和 TypeScript 编写一个小项目,其中一个要求是从 .pfx 文件中读取 PFX 证书并在代码中使用它来加密有效负载主体

我有一个名为cert1.pfx的证书公钥/私钥文件,我的代码需要此证书,如下所示

...
const cert = loadPfx("cert1.pfx");
const p: Payload = new Payload();
p.addReaderCertificate(cert);
...

我四处搜索,但找不到为我的用例加载 PFX 的方法,我看到了为 HTTPS 服务器或 Express.JS 加载 PFX 的示例,我查看了 node-x509,但那是用于 BASE64 编码的 CER 或 PEM 证书,我还查看了 node-rsa,但那是使用公钥/私钥进行加密/解密。

有谁知道这是否可能? 如果是这样,将不胜感激有关如何完成的一些指示。

因此,经过大量研究和搜索 Google 档案后,我发现了一个名为pem的包,它具有以下方法:

pem.readPkcs12(bufferOrPath, [options], callback)

这可以读取 PKCS#12 文件(或者换句话说, *.pfx*.p12文件)等等,我在早期的研究中一定错过了这一点。

用法:

const pem = require("pem");
const fs = require("fs");

const pfx = fs.readFileSync(__dirname + "/test.pfx");
pem.readPkcs12(pfx, { p12Password: "password" }, (err, cert) => {
    console.log(cert);
});

输出:

{ cert: "...", ca: ["subca", "rootca"], key: "..." }

你可以在这里这里找到更多。

听起来你只需要使用 Node 自己的 https 功能。 Node 可以直接读取 PFX 文件。 Https.createServerSSL 选项

来自 Node.js 站点的示例:

const https = require('https');
const fs = require('fs');

const options = {
  pfx: fs.readFileSync('test/fixtures/test_cert.pfx'),
  passphrase: 'sample'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(8000);

我也遇到了类似的问题@neil-stevens 解决方案帮助我阅读了 .pfx 文件,但我发现 pem 的一个功能/错误(我不知道它到底是什么)它主要返回加密的私钥在 RSA 中,但如果您需要实际的私钥,则需要将加密密钥导出到 pkcs8,这可以使用Node RSA完成。

用法 :

const RSAKey = cert.key; const key = new NodeRSA(RSAKey); const privateKey = key.exportKey("pkcs8");

补充尼尔史蒂文斯的答案(对不起,我知道如何引用)。

  • 我遇到了仅获取空对象的问题,但是我只是观察到我没有记录err 所以我这样做了,之后我能够解决我的问题

1º 您需要安装https://github.com/Dexus/pem上描述的 openSSL 或 libressl。

  • 提示:如果您已经配置并安装了 Chocolatey,请安装。 只需运行命令:“choco install openssl”。 (具有提升的权限)

2º 我不得不使用 pem.config() 来设置 openSSL 文件夹的精确路径。 我认为您也可以在环境变量中定义,我只是还没有以这种方式进行测试。

3º最后我的代码是这样的:

const pem = require("pem");
const fs = require("fs");
const pfx = fs.readFileSync("./cert.pfx");
let certificate = '';

pem.config({
  pathOpenSSL: 'C:\\Program Files\\OpenSSL-Win64\\bin\\openssl'
})

const getPrivateKey = async () => {
  return new Promise(async (resolve, reject) => {
    pem.readPkcs12(pfx, { p12Password: 'myPassWordStr' }, (err, cert) => {
      console.log('err::: ', err);
      // console.log('cert::: ', cert);
      resolve(cert);
    });
  });
}

const start = async () => {
  certificate = await getPrivateKey();
  console.log('privateKey::: ', certificate);
}

start();

我来到这里时试图找到一种方法来使用.NET CLI 生成的开发证书(因为它很容易创建/信任/删除)来配置具有 HTTPS 的本地 Web 服务器以进行本地开发。

感谢Neil Stephen 的回答,我能够使用 npm、 dotnet CLI、 openssl和 npm 包pem的组合在 Windows 上创建一个有效的解决方案。

Git附带了一份 OpenSSL,所以我不需要单独安装它 :)

.env

OPENSSL_PATH=C:\Program Files\Git\usr\bin\openssl
CERT_PASSWORD=SecurePassword123
CERT_PFX=cert/localhost.pfx
CERT_PEM=cert/localhost.pem
CERT_KEY=cert/localhost.key
PORT=443
ENTRYPOINT=src/index.html

包.json

"scripts": {
  "start": "env-cmd -x parcel $ENTRYPOINT --https --cert $CERT_PEM --key $CERT_KEY --port $PORT --open",
  "build": "env-cmd -x parcel build $ENTRYPOINT",
  "dev-certs": "run-s dev-certs:create dev-certs:convert",
  "dev-certs:create": "env-cmd -x dotnet dev-certs https -ep $CERT_PFX -p $CERT_PASSWORD --verbose --trust",
  "dev-certs:convert": "node ./cli/cert.mjs",
  "dev-certs:clean": "dotnet dev-certs https --clean"
},

证书.mjs

import pem from "pem";
import { PFX2PEM } from "pem/lib/convert.js";
import fs from "fs";
import "dotenv/config";

pem.config({
  pathOpenSSL: process.env.OPENSSL_PATH
});

const pass = process.env.CERT_PASSWORD;

// GET .KEY FILE - without this, HMR won't work
const pfx = fs.readFileSync(process.env.CERT_PFX);
pem.readPkcs12(pfx, { p12Password: pass }, (err, cert) => {
  if (!!err) {
    console.error(err);
    return;
  }
  // console.log(cert.key);
  fs.writeFileSync(process.env.CERT_KEY, cert.key);
});

// GET .PEM FILE
PFX2PEM(process.env.CERT_PFX, process.env.CERT_PEM, pass, (errPem, successPem) => {
  if (!successPem) {
    console.error(errPem);
    return;
  }
  
  console.log(`Certificate '${process.env.CERT_PEM}' created!`);
});

存储库在这里: https ://github.com/zplume/parcel-https 并且README包含其工作原理的详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM