如何解密 Outlook 发送的损坏的 S/MIME 邮件?

Jen*_*rat 7 microsoft-outlook encryption email thunderbird smime

最近,我收到一封 Outlook 发送的加密邮件,但我无法解密。Thunderbird 正在打印以下错误消息:

Thunderbird 无法解密此消息

发件人使用您的数字证书之一加密了此消息,但 Thunderbird 无法找到此证书和相应的私钥。可能的解决方案:

  • 如果您有智能卡,请立即插入。
  • 如果您使用的是新机器,或者您使用的是新的 Thunderbird 配置文件,则需要从备份中恢复您的证书和私钥。证书备份通常以“.p12”结尾。

其他邮件客户端(包括最新版本的 Outlook!)也无法解密邮件。由于邮件很重要,我不想让发件人重新发送邮件,我该怎么办?

Jen*_*rat 14

问题

这是Microsoft Outlook 2010 的一个已知问题,但提供了一个修复程序 - 您可能想要通知发件人他应该应用它。

X.509 证书附加了几个属性,其中一些属性可用于识别证书。一种这样的方法是将序列号与证书颁发者一起使用(它们必须一起形成唯一标识符)。对于 S/MIME 加密邮件,这称为issuerAndSerialNumber。另一种选择是标准化的subjectKeyIdentifier,它“应该”以某种形式从公钥派生,但没有具体定义。

subjectKeyIdentifier如果未提供此类标识符,则Outlook 2010(SP1 之前)使用并创建一个(来自上面链接的知识库文章,突出显示是我添加的):

加密消息语法 (CMS) 记录在 RFC 5652 中。该规范允许使用 subjectKeyIdentifier 或 issuerAndSerialNumber 作为 SignerIdentifier。Outlook 2010 的发布 (RTM) 版本使用 subjectKeyIdentifier 作为 SignerIdentifier,而早期版本使用 issuerAndSerialNumber。如果证书中未定义 subjectKeyIdentifier 扩展名,Outlook 2010 RTM 会生成一个。某些电子邮件客户端或第三方操作系统无法使用 Outlook 生成的 subjectKeyIdentifier。这会导致收件人无法解密和阅读邮件。

换言之,Microsoft Outlook 2010 SP1 之前的版本使用的证书标识符很可能不被任何其他邮件应用程序理解。我实际上未能使用最新版本的 Outlook 来解​​密这样的消息!

无论如何如何解密消息

这并不容易,并且涉及到命令行。这应该适用于几乎所有操作系统(Linux、Windows、macOS、任何 BSD),确保安装了 OpenSSL。使用 OpenSSL,我们可以使用特定的密钥强制解密,忽略损坏的subjectKeyIdentifier.

  1. 将消息保存到某个文件夹(Thunderbird 会将其保存为.eml文件)。我mail.eml在所有进一步的步骤中命名了它。
  2. 导出私钥(打开PreferencesAdvancedCertificatesView Certificates,选择适当的证书,Backup,选择用于消息的相同文件夹)。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
    
    Run Code Online (Sandbox Code Playgroud)

    解密后的消息将存储在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
Run Code Online (Sandbox Code Playgroud)

decoded.txt文件将最终包含解密的消息。如果特殊字符的编码似乎仍然错误,请使用您选择的转换工具或尝试在 Firefox 或其他浏览器中打开文件——通常,它们在修复混乱的编码方面做得很好。

将新的未加密.eml消息放在一起需要剥离所有Content-*标头并将所有标Content-*头从解密的消息中移到此处。更多细节超出了本教程的范围,有太多不同的编码无法提供合理的帮助。