尝试使用 Openssl 解密 S/MIME 文件

Posted

技术标签:

【中文标题】尝试使用 Openssl 解密 S/MIME 文件【英文标题】:Trying to decrypt S/MIME file using Openssl 【发布时间】:2015-04-15 15:02:40 【问题描述】:

我是 openssl 新手。 我正在尝试编写一个python脚本(调用openssl)来解密多个p12加密的eml文件但失败了。

我可以在 Thunderbird 中打开它们。

这是我尝试过的:

openssl pkcs12 -in keys/pkitepki.p12 -clcerts -nokeys -out file.crt.pem
openssl pkcs12 -in keys/pkitepki.p12 -nocerts -out file.key.pem
openssl smime -decrypt -in smime.p7m -recip file.crt.pem  -inkey file.key.pem 

我得到的错误是:

Error reading S/MIME message
139955665413864:error:0D0D40D1:asn1 encoding routines:SMIME_read_ASN1:no content type:asn_mime.c:451

我的步骤有什么问题?

【问题讨论】:

【参考方案1】:

输入不应是 smime.p7m。它应该是其中包含 smime.p7m 的电子邮件。应该有电子邮件标头和 base64 编码的内容。

【讨论】:

【参考方案2】:

使用 cms 代替 smime:

openssl cms -decrypt -in smime.p7m -recip file.crt.pem  -inkey file.key.pem

【讨论】:

【参考方案3】:

就我而言,我从 Gmail 中获得的加密 .p7m 文件附件是 DER 格式,而不是 OpenSSL default(默认为 SMIME 格式)。因此,只需将 -inform DER 添加到您的 OpenSSL 命令中,看看它是否有效。

这是我原来的 OpenSSL 命令:

openssl smime -decrypt -in "smime.p7m" -inkey "georgie_smime.key.pem"

输出了这个错误Error reading S/MIME message 2147483656:error:0D0D40D1:asn1 encoding routines:SMIME_read_ASN1:no content type:crypto/asn1/asn_mime.c:391:

所以只需添加-inform DER

openssl smime -decrypt -in "smime.p7m" -inform DER -inkey "georgie_smime.key.pem"

它成功了!

另外,如果该信息对任何人有用,我会使用 BouncyCastle 在 Java 中发送实际的 SMIME 加密电子邮件

【讨论】:

以上是关于尝试使用 Openssl 解密 S/MIME 文件的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL 解密失败但错误代码为 0

OpenSSL 和 C# 之间的不同 S/MIME 签名

使用 openssl 生成证书

从 MIME 创建 S/MIME?

使用openssl加密和解密一个小文件

使用rust的openssl库加密/解密大文本