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
相关产品推荐
相关产品推荐

