如何在Go语言中解密无DEK-Info头的带密码加密私钥
解决Go语言解密PKCS#8加密私钥的问题
问题原因
你生成的私钥是PKCS#8加密格式(PEM头为-----BEGIN ENCRYPTED PRIVATE KEY-----),而废弃的x509.DecryptPEMBlock仅支持传统PKCS#1加密私钥(这类私钥会带有DEK-Info头字段),因此直接调用该方法会触发no DEK-Info header in block错误。
解决方案:使用x509.DecryptPKCS8PrivateKey
Go标准库提供了专门处理PKCS#8加密私钥的x509.DecryptPKCS8PrivateKey函数,无需额外依赖,直接替换原有解密逻辑即可。
修改后的代码示例
import ( "crypto/x509" "encoding/pem" "fmt" "os" ) func loadEncryptedPrivateKey(path string, password []byte) (interface{}, error) { privateKeyPEM, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("读取私钥文件失败: %v", err) } privateKeyBlock, _ := pem.Decode(privateKeyPEM) if privateKeyBlock == nil { return nil, fmt.Errorf("解析PEM格式失败") } // 针对PKCS#8加密私钥执行解密 privateKey, err := x509.DecryptPKCS8PrivateKey(privateKeyBlock.Bytes, password) if err != nil { return nil, fmt.Errorf("解密私钥失败: %v", err) } return privateKey, nil }
代码说明
x509.DecryptPKCS8PrivateKey直接接收PKCS#8加密私钥的原始字节和密码,返回解密后的私钥对象(实际类型为*rsa.PrivateKey,可通过类型断言转换后使用)。- 解密后的私钥可直接用于TLS配置,示例如下:
key, err := loadEncryptedPrivateKey("passcode-protected-private.key", []byte("my-password")) if err != nil { // 处理错误逻辑 } tlsConfig := &tls.Config{ Certificates: []tls.Certificate{ { PrivateKey: key, // 填入对应证书内容 }, }, }
格式验证(可选)
若要确认私钥格式,可执行以下openssl命令:
openssl pkcs8 -in passcode-protected-private.key -info
输入密码后会显示PKCS#8的加密算法等信息,验证格式正确性。
内容的提问来源于stack exchange,提问作者zipzapzoop45
相关产品推荐
相关产品推荐

