"No DEK-Info header in block" 尝试读取加密私钥时

"No DEK-Info header in block" when attempting to read encrypted private key

我正在尝试读取加密的 PKCS8 私钥文件。我生成了这样的密钥:

openssl genrsa -out file.pem -passout pass:file -aes256 1024
openssl pkcs8 -topk8 -inform pem -in file.pem -outform pem -out filePKCS8.pem

然后我尝试用 Go 以这种方式阅读它:

block, _ := pem.Decode(key)
return x509.DecryptPEMBlock(block, password)

但我收到一条错误消息:

x509: no DEK-Info header in block

但是,我不知道出了什么问题。我是生成了错误的密钥还是使用了错误的库?我看到库专门用于读取未加密的 PKCS8 文件,但 none 专门用于加密的 PKCS8 文件。

有人知道吗?

Go 没有解密标准库中的 PKCS8 密钥的功能。

你可以这个包: https://github.com/youmark/pkcs8/blob/master/pkcs8.go#L103

为遇到相同问题的任何人提供更长的解释。

什么会起作用

你的第一个命令

openssl genrsa -out file.pem -passout pass:file -aes256 1024

生成 PKCS#1 私钥文件 (file.pem):

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,1DA219DB746F88C6DDA0D852A0FD3232

AEf09rGkgGEJ79GgO4dEVsArwv4IbbODlxy95uHhfkdGYmuk6OlTpiCUE0GT68wn
KFJfBcHr8Z3VqiHGsXxM5QlKhgnfptxfbrdKErgBD5LQcrvnqmf43KeD4lGQcpiy
...
...
mAKMCwiU/GKZz8ZwQ4qGkBlVVCOFfgwmfbqguJF2l8yzM8lYI9MZ9NEwKkvEbc
-----END RSA PRIVATE KEY-----

这个私钥文件x509.DecryptPEMBlock()可以解析解密了

什么不起作用,为什么

你的第二个命令

openssl pkcs8 -topk8 -inform pem -in file.pem -outform pem -out filePKCS8.pem

将该文件转换为 PKCS#8 格式 (filePKCS8.pem)。

子命令 genpkey 会直接产生类似的结果:

openssl genpkey -algorithm RSA -aes256 \
  -pkeyopt rsa_keygen_bits:1024 -out filePKCS8.pem

生成的 filePKCS8.pem(无论哪种方式)看起来类似于:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIISrTBXBgkqhkiG9w0BBQ0wSjKpBgkqhkiG9w0BBQwwHAQIKL+ordsVfqsCAggB
MAwGCCqGSIb3DQIJCQAwHQYJYIZIWAUDBAEqBBCipOAAxWkC0/zkNLNYTSMgBIIS
...
...
zfdxjZ0XmPiwED2azsLMnRrWnRj2UqMtnv9zO/ucik9za
-----END ENCRYPTED PRIVATE KEY-----

x509.DecryptPEMBlock() 不支持此格式。并且如#8860所述,Go 的核心库在不久的将来没有真正支持 pkcs#8 的计划。

Gregory, if you want to work with it, you'll have better luck with 3rd party library like github.com/youmark/pkcs8 (Documentation 所述)。