Nodejs从文件加载PFX证书



我正在使用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或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: "..." }

您可以在这里和这里找到更多。

听起来您只需要使用节点自己的HTTPS功能。节点可以直接读取PFX文件。(https.createserver,SSL选项)

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 worldn');
}).listen(8000);

我也被困在类似的问题上 @neil-stevens解决方案帮助我读取.pfx文件,但是我发现的是一个功能/错误(我不知道它是什么IS)PEM是它返回加密的私有密钥,主要是在RSA中,但是如果您需要实际的私钥,则需要将加密密钥导出到PKCS8中,可以使用Node RSA进行。

用法:

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

补充尼尔·史蒂文斯(Neil Stevens)的答案(对不起,idk如何引用)。

  • 我只能获取一个空对象的问题,但我只是观察到我没有挡住 err 。所以我做到了,之后我能够解决我的问题

1º您需要安装openssl或libressl在https://github.com/dexus/pem中的描述。

  • 提示:如果您已经配置并安装了巧克力,请安装。只需运行命令:'choco install openssl; quot''。(具有高度权限)

2º我必须使用pem.config()设置OpenSSL文件夹的exatcly路径。我认为您也可以在环境变量中定义,我只是没有这样测试。

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服务器的方法时到达这里(因为这很容易创建/Trusted/Trusted/删除)。

感谢Neil Stephen的答案,我能够在Windows上创建一个工作解决方案,使用NPM,dotnet CLI,openssl和NPM软件包pem

Git带有openssl副本,所以我不需要单独安装它:)

.env

OPENSSL_PATH=C:Program FilesGitusrbinopenssl
CERT_PASSWORD=SecurePassword123
CERT_PFX=cert/localhost.pfx
CERT_PEM=cert/localhost.pem
CERT_KEY=cert/localhost.key
PORT=443
ENTRYPOINT=src/index.html

package.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"
},

cert.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包含有关其工作原理的详细信息。

相关内容

  • 没有找到相关文章

最新更新