如何解密 Outlook 发送的损坏的 S/MIME 消息?

如何解密 Outlook 发送的损坏的 S/MIME 消息?

最近,我收到了 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

  1. 将消息保存到某个文件夹(Thunderbird 将把它保存为.eml文件)。我mail.eml在后续步骤中为它命名。

  2. 导出私钥(打开优先先进的证书查看证书,选择适当的证书,备份,选择与邮件使用的文件夹相同的文件夹)。Thunderbird 将查询密码。您现在应该有另一个带.p12扩展名的文件。我将其命名为certificate.p12

  3. 打开终端。所有后续步骤都将在命令行上完成。

  4. 使用命令导航到该文件夹cd​​。

  5. 为了解密消息,我们需要 PEM 格式的私钥。要转换密钥,请运行openssl pkcs12 -in certificate.p12-out privatekey.pem -nodes`。系统将要求您输入在 Thunderbird 中输入的密码。

  6. 现在使用导出的密钥来解密消息:

     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-*标头从此处的解密消息中移出。更多详细信息超出了本教程的范围,因为有太多不同的编码,无法提供合理的帮助。

相关内容