"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 所述)。
我正在尝试读取加密的 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 所述)。