![S/MIME 签名的电子邮件丢失附件](https://linux22.com/image/1563944/S%2FMIME%20%E7%AD%BE%E5%90%8D%E7%9A%84%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E4%B8%A2%E5%A4%B1%E9%99%84%E4%BB%B6.png)
我们有少数用户对电子邮件进行数字签名(但不加密)。当他们发送附件时,通常可以正常工作。但是,当收件人使用 Outlook Mobile 时,所有附件都会消失,只留下 S/MIME p7m 文件。这是一个已知问题吗?除了不对邮件进行签名外,还有其他解决方案吗?
到目前为止,我们怀疑发送客户端正在将其他附件捆绑在 p7m 内,而忽略了以下事实:1)消息已签名但未加密,2)某些客户端可能无法再次提取它们。
答案1
更新后的答案现在包括不透明的签名
这p7m通常是一个加密电子邮件(包括所有附件),但必须知道Content-type
才能确定。如果您在接收邮件客户端中只能看到 p7m 附件,则可能意味着邮件已被整个加密并且接收客户端无法解密 S/MIME 消息。
原因可能多种多样,如果没有进一步的细节就很难说清楚。最明显的原因是收件人的私钥不可用或未与接收客户端中配置的电子邮件地址关联。
要验证消息是否已签名或加密,请查看原始电子邮件消息。
加密内容
在加密的电子邮件中,你会发现类似的标题:
Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data
Content-Disposition: attachment; filename="smime.p7m"
后面是编码后的加密电子邮件。
签名电子邮件然而,可以有两种不同的风格。引自RFC 8551:
S/MIME 定义了两种签名邮件格式:
带有 SignedData 的 application/pkcs7-mime。
多部分/签名。
一般来说,发送时优先使用 multipart/signed 格式,并且接收代理必须能够处理这两种格式。
分离签名
所谓的分离签名是最常见的签名。邮件内容以明文形式保存,签名附加在电子邮件中。对于这种签名的电子邮件,您应该找到类似以下的 Content-type 标头:
Content-Type: multipart/signed;
boundary="BC5E686BA36";
protocol="application/pkcs7-signature";
micalg=sha1
并且很可能在同一消息的结尾附近:
Content-Disposition: attachment;
filename=smime.p7s
Content-Type: application/pkcs7-signature;
name=smime.p7s
后面跟着编码的签名。如果是仅有的签名后您应该就能看到消息文本。
不透明的签名
但是,也有所谓的不透明签名,即对签名中的全部内容进行编码,因此电子邮件不再包含明文。在这种情况下,您应该找到以下标头:
Content-Type: application/pkcs7-mime;
smime-type=signed-data;
name="smime.p7m"
Content-Disposition: attachment;
filename="smime.p7m"
请注意,文件名看起来像加密电子邮件,但 MIME 类型不同。
结论
再次引用RFC 8551:
无论接收方是否安装了 S/MIME 软件,都可以查看使用 multipart/signed 格式签名的消息。无论接收方使用的是 MIME 原生用户代理还是通过网关转换消息,都可以查看这些消息。在此上下文中,“可查看”是指能够像处理非签名消息一样处理消息,包括消息可能具有的任何其他 MIME 结构。
除非收件人拥有 S/MIME 功能,否则收件人无法查看使用 SignedData 格式签名的邮件。不过,SignedData 格式可以保护邮件内容不被良性中间代理更改。这些代理可能会进行换行或内容传输编码更改,从而破坏签名。
因此,如果您在电子邮件客户端中只看到 p7m-附件,则可能的原因是
- 电子邮件已加密,但电子邮件客户端没有可用于解密邮件的相应私钥
- 电子邮件是不透明签名的,但电子邮件客户端不支持不透明签名
后者是 Outlook Web App (OWA) 的情况,但我不知道现在是否仍然如此。
答案2
我认为 Outlook Mobile 不支持 S/MIME。因此您无法阅读数字签名的电子邮件,也无法通过 Outlook Mobile 发送这些电子邮件。