最近,我收到了 Outlook 发送的一封加密邮件,但无法解密。Thunderbird 打印了以下错误消息:
Thunderbird 无法解密此消息
发件人使用您的一个数字证书加密了此消息,但 Thunderbird 无法找到此证书和相应的私钥。可能的解决方案:
- 如果您有智能卡,请立即插入。
- 如果您使用的是新机器,或者使用的是新的 Thunderbird 配置文件,则需要从备份中恢复您的证书和私钥。证书备份通常以“.p12”结尾。
其他邮件客户端(包括最新版本的 Outlook!)也未能解密该邮件。由于该邮件非常重要,而且我实在不想要求发件人重新发送邮件,我该怎么办?
答案1
问题
这是一个Microsoft Outlook 2010 的已知问题,但提供了修复程序——您可能需要通知发件人他应该应用它。
X.509 证书附带多个属性,其中一些可用于识别证书。其中一种方法是将序列号与证书颁发者一起使用(它们必须一起形成唯一标识符)。对于 S/MIME 加密消息,这称为issuerAndSerialNumber
。另一种方法是同样标准化的subjectKeyIdentifier
,它“应该”以某种形式从公钥派生而来,但并未具体定义。
如果没有提供这样的标识符,Outlook 2010(SP1 之前)将使用subjectKeyIdentifier
并创建一个(来自上面链接的知识库文章,突出显示由我添加):
加密消息语法 (CMS) 记录在 RFC 5652 中。该规范允许使用 subjectKeyIdentifier 或 issuerAndSerialNumber 作为 SignerIdentifier。Outlook 2010 的发布 (RTM) 版本使用 subjectKeyIdentifier 作为 SignerIdentifier,而早期版本使用issuerAndSerialNumber。如果证书中未定义 subjectKeyIdentifier 扩展,Outlook 2010 RTM 将生成一个。某些电子邮件客户端或第三方操作系统无法使用 Outlook 生成的 subjectKeyIdentifier。这导致收件人无法解密和阅读该消息。
换句话说,Microsoft Outlook 2010 pre-SP1 使用证书标识符很可能任何其他邮件应用程序都无法理解。实际上,我使用最新版本的 Outlook 解密此类邮件时失败了!
如何解密信息
这并不容易,需要转到命令行。这应该适用于几乎所有操作系统(Linux、Windows、macOS、任何 BSD),请确保安装了 OpenSSL。使用 OpenSSL,我们可以使用特定密钥强制解密,而忽略损坏的subjectKeyIdentifier
。
将消息保存到某个文件夹(Thunderbird 将把它保存为
.eml
文件)。我mail.eml
在后续步骤中为它命名。导出私钥(打开优先,先进的,证书,查看证书,选择适当的证书,备份,选择与邮件使用的文件夹相同的文件夹)。Thunderbird 将查询密码。您现在应该有另一个带
.p12
扩展名的文件。我将其命名为certificate.p12
。打开终端。所有后续步骤都将在命令行上完成。
使用命令导航到该文件夹
cd
。为了解密消息,我们需要 PEM 格式的私钥。要转换密钥,请运行
openssl pkcs12 -in certificate.p12
-out privatekey.pem -nodes`。系统将要求您输入在 Thunderbird 中输入的密码。现在使用导出的密钥来解密消息:
openssl cms -decrypt -in mail.eml -inkey privatekey.pem -out decrypted.txt
解密后的消息将存储在
decrypted.txt
文件中。
该消息可能被编码为quoted-printable
。如果您遇到奇怪的字符序列,如Gr=FC=DFe
并且包含标题Content-Transfer-Encoding: quoted-printable
,请将消息转换为纯文本(您需要 Perl,可能仅限于版本 5 和模块MIME::QuotedPrint
):
perl -MMIME::QuotedPrint -pe '$_=MIME::QuotedPrint::decode($_);' <decrypted.txt >decoded.txt
该decoded.txt
文件最终将包含解密后的消息。如果特殊字符的编码仍然看起来不正确,请使用您选择的转换工具,或者尝试在 Firefox 或其他浏览器中打开该文件 - 通常,它们在修复混乱的编码方面做得很好。
整理一条新的未加密.eml
消息需要删除所有Content-*
标头,并将所有Content-*
标头从此处的解密消息中移出。更多详细信息超出了本教程的范围,因为有太多不同的编码,无法提供合理的帮助。