You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js crypto.createPrivateKey()在Electron中加载加密私钥失败求助

Electron中Node.js crypto模块加载加密私钥失败的解决方案

问题描述

我使用Node.js的crypto模块(const nodecrypto = require('crypto')),尝试通过crypto.createPrivateKey()和crypto.sign()用私钥签名数据。代码在纯Node.js环境运行正常,但在Electron中执行时失败,报错如下:

App threw an error during load
Error: error:13000077:PKCS8 routines:OPENSSL_internal:UNKNOWN_ALGORITHM
    at Object.createPrivateKey (node:internal/crypto/keys:618:12)
    at Object.<anonymous> (C:\projects\ElectronWithCrypto\index.js:5:26)
    at Module._compile (node:internal/modules/cjs/loader:1120:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1175:10)
    at Module.load (node:internal/modules/cjs/loader:988:32)
    at Module._load (node:internal/modules/cjs/loader:829:12)
    at c._load (node:electron/js2c/asar_bundle:5:13339)...

已尝试的操作:

  • 升级Node.js和Electron至最新版本
  • 升级Node.js LTS和Electron至最新版本
  • 将Node.js降级为Electron v21.0.0官方支持的LTS版本(v16.16.0)

复现代码

index.js(私钥为自签名,仅用于复现问题)

const nodecrypto = require('crypto');
var privateKey = '-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIE6jAcBgoqhkiG9w0BDAEEMA4ECIqpVyEVvvOVAgIEigSCBMg2fnThnSdqpDJZ3Xxh26ch2N3PRS3l7ixZwmlecxkw2+LYAvyfqhTj/1CvEPK1L9T6C5tfcJQkt6figgvaAqekrI8f3oZTUoJEFxdRXXPC7x+Pri7yCwFP8p7b3ZYG1WKe0g4dYcga/GjEQAhH6ek9SO1TLnC/LbIVez4S7KzssPCECpzZCJhm/rbqUhkmnCfMHrf+L2T5ahkOXs/5YdgtkYuKyCODHeI6cSNQom5CXHeA5OB1tMy1rn07ev4dzF8e0ydOUveVVVpXvptj7wiVuScmNaF90rUVEWPhEqbZySb6jxX8VJ0CJwPCLwJD7qSxm8gL/XYQdGk5BVa04szzmT/3mWHNk3oTOey611lggCWM3OTDscfn3gMPmcpWXuK0Yto/LiFvPTMo5306MTuo7K6kQC9rBYdAV+IjcE1+1s+FYHkIUbLUfAwAqX8zTeI/gERIqdWfcZUKewPEnFzRB3zM1wPGvdWErnGbSDLx3PLk+f50jcTtSy7ocK8UD+6WHLrrkWxcaMiosmqq26U44sCJ8V0WBa5Wfp1lbtG7mdo4SO7dThOIlEvdRsM+YhT3ffN2eIRoMhrgx+E6JTe2MZaOHEGQ1NpnFXixZYJlyEkjI128dW9TJZaXWxBvBJ/66kf2gc/JygwIcd2MwaDlXBdmZpxaqfhXG5L5yhJoG70V7jMnem+YqGjVP8JnYmVdHPuUYObSXh/hH14lqpul5i2Ew6TABKcKD2NKel26jS50eIX9nLOheZaO7D0lMkUG/7F225Jh+lNgI4Mm6XprT9rygpeHVG46wOjH7Ynp3uxWERfmZemLgyMhPcQctpYnR90MTyWgajK047IAKlaySYHlJb2ROnKdeF+a4OS4B+TDIr+cCnCW57dWMDRdOss/ii9nrdLeX3XZv2gVnCefWSCxphBGddpaK725GYmbL56gdOAjrEHv5Xvcdu2RAtJ2p2SfOdfdUT0LLE5HBgArNFB2kacUVGdfo5lATcJbUQh2xI7yMyZr8uaDchB7tIEbeO1CKxwxOh4r7v4wxQqLgpQEJ/Faq2GQaLEGuYkd97KepfgBXzKpel9lMxzOr06+QmUptLqOK5ENRRykpMkdf2m8qX8M+a5u7xVf70ThBLkADTGS2JHE/BbYavsnP4CFwJDkzzsIQjNYuzqoVboGDRghF7rMAdH22CO8hSR2Cr6nFQ147H5QOSk1bpeoN7eOHtg5j5cNrF+DpVjFJVANvw0/6rgQ3H1FzXQpRLQLsT/pk33XV844UZgWucyUlFaXQqe2e23T1WJ7BUowqMtyB26nSd84ETBXTec5UB9V4TE2UUKh9iRzAIjn65WifECOuse3xW/KD6zuV1WD9paVgloZRaxTjMzfjI+7QLGTB0TUaSY9O9+2GnnyluuHUD4mGsJNwmFxLdfEB+0S1hUivi7JszHG3npvMEGovOpuOb5SkqgPz9sXPWUDWeGJsfc92+jzM0orxZt5pI2EeCQE/LrmzFWIYPffDsrUKg44lp2m/A01T5+3CsJoz0LMpKnvtEtFul0RQWx0L//tju85wB/vBMsNsm98auPmCftL5WWXF1teOz4y/6JauCOn/wq5wQtM7KZ5Q+9hpDJQuRqMFs2Wnc2Q5uo=
-----END ENCRYPTED PRIVATE KEY-----';

var privKey = nodecrypto.createPrivateKey({
    key: privateKey,
    passphrase: 'test',
    encoding: 'utf-8'
});

package.json

{
  "name": "ElectronWithCrypto",
  "main": "index.js",
  "scripts": {
    "start": "electron ."
  },
  "devDependencies": {
    "electron": "^21.0.0"
  }
}

解决方案

这个报错的核心原因是Electron内置的OpenSSL版本与Node.js官方版本存在算法支持差异,你的加密私钥使用了Electron的OpenSSL不识别的加密算法。可以通过以下方法解决:

方法1:重新生成兼容的加密私钥

使用OpenSSL命令生成Electron支持的PKCS8格式加密私钥,推荐使用AES-256-CBC算法(Electron的OpenSSL对该算法有良好支持):

  1. 生成RSA私钥并加密:
openssl genrsa -aes256 -out private.key 2048

执行时会提示输入密码,比如输入test。

  1. 转换为PKCS8格式:
openssl pkcs8 -topk8 -in private.key -out encrypted_private.pem -v2 aes-256-cbc

再次输入之前设置的密码test,生成的encrypted_private.pem就是Electron兼容的加密私钥,替换代码中的privateKey内容即可。

方法2:使用未加密的私钥(仅用于测试或非敏感场景)

如果只是临时测试,可以先解密私钥,得到未加密的版本后在代码中使用:

  1. 解密私钥:
openssl rsa -in 你的加密私钥文件.pem -out decrypted_private.pem

输入私钥密码test,生成未加密的私钥文件。

  1. 修改代码,使用未加密的私钥,去掉passphrase参数:
var privateKey = '-----BEGIN RSA PRIVATE KEY-----
// 解密后的私钥内容
-----END RSA PRIVATE KEY-----';

var privKey = nodecrypto.createPrivateKey({
    key: privateKey,
    encoding: 'utf-8'
});

注意:未加密的私钥存在安全风险,生产环境不建议使用。

方法3:指定私钥格式与算法参数

在调用createPrivateKey时,明确指定私钥格式和加密算法,尝试让Electron的OpenSSL正确识别:

var privKey = nodecrypto.createPrivateKey({
    key: privateKey,
    passphrase: 'test',
    encoding: 'utf-8',
    format: 'pem',
    type: 'pkcs8',
    // 如果知道私钥使用的加密算法,可直接指定,比如aes-256-cbc
    cipher: 'aes-256-cbc'
});

如果不确定算法,可以先通过OpenSSL命令查看私钥的加密算法:

openssl pkcs8 -in encrypted_private.pem -info -noout

输出中会显示Encryption Algorithm字段,将对应算法填入cipher参数。

内容的提问来源于stack exchange,提问作者pnoytechie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:32:08