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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:55:24