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

Node.js生成的RSA私钥无法被Go识别为PEM格式求助

问题:Node.js生成的RSA私钥无法在Go中加载

我使用Node.js的crypto库生成RSA公钥和私钥对,在Node.js环境中可正常加解密,但在Go中加载时,公钥能被识别为PEM格式并成功加载,私钥却始终无法识别,多次重新生成密钥问题依然存在。

Node.js密钥生成代码

function generateKeyFiles() {
  const keyPair = crypto.generateKeyPairSync("rsa", {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: "spki",
      format: "pem",
    },
    privateKeyEncoding: {
      type: "pkcs8",
      format: "pem",
      cipher: "aes-256-cbc",
      passphrase: "",
    },
  });
  // 写入密钥文件
  fs.writeFileSync("public_key", keyPair.publicKey);
  fs.writeFileSync("private_key", keyPair.privateKey);
}

Go密钥加载代码片段

// 加载Node.js生成的公钥文件
publicKeyData, err := ioutil.ReadFile("public_key")
if err != nil {
fmt.Println("Error reading the public key file:", err)
return
}

// 解析PEM格式公钥
block, _ := pem.Decode(publicKeyData)
if block == nil || block.Type != "PUBLIC KEY" {
fmt.Println("The public key file is not in PEM format")
return
}
publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
fmt.Println("Error loading the public key:", err)
return
}

// 公钥加载成功
fmt.Println("Public key loaded successfully:", publicKey)

// 加载Node.js生成的私钥文件
privateKeyData, err := ioutil.ReadFile("private_key")
if err != nil {
fmt.Println("Error reading the private key file:", err)
return
}

// 解析PEM格式私钥
block, _ = pem.Decode(privateKeyData)
if block == nil || block.Type != "PRIVATE KEY" {
fmt.Println("The private key file is not in PEM format")
return
}

问题原因及解决方案

原因分析

Node.js生成私钥时指定了cipher: "aes-256-cbc"加密算法,即使passphrase为空字符串,生成的私钥依然是加密状态的PKCS8格式。而当前Go代码仅做了PEM块解码,没有处理加密私钥的解密步骤,导致后续无法正常解析。

解决方案

有两种处理方式可选:

方案1:生成未加密的私钥

修改Node.js代码,去掉私钥编码配置中的cipher和passphrase字段,生成未加密的PKCS8私钥,Go代码无需额外解密即可直接解析:

privateKeyEncoding: {
  type: "pkcs8",
  format: "pem"
}

对应的Go解析代码补充:

privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
  fmt.Println("Error loading private key:", err)
  return
}
fmt.Println("Private key loaded successfully:", privateKey)

方案2:Go代码处理加密私钥

如果需要保留私钥加密,在Go代码中添加解密步骤,传入空密码(与Node.js生成时的passphrase一致):

// 解密加密的PEM块
decryptedBytes, err := x509.DecryptPEMBlock(block, []byte(""))
if err != nil {
  fmt.Println("Error decrypting private key:", err)
  return
}
// 解析解密后的PKCS8私钥
privateKey, err := x509.ParsePKCS8PrivateKey(decryptedBytes)
if err != nil {
  fmt.Println("Error loading private key:", err)
  return
}
fmt.Println("Private key loaded successfully:", privateKey)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:05:29