【问题标题】:Check if email is digitally signed using VB.Net检查电子邮件是否使用 VB.Net 进行数字签名
【发布时间】:2019-04-05 03:58:59
【问题描述】:

我想知道是否可以使用 VB.Net 检查电子邮件是否经过数字签名以及证书的颁发者是谁。

使用扩展的 MAPI Wrapper 和 Cryptography 我能够从电子邮件中获取 smime.p7m 附件并从中获取证书信息(包括颁发者),因此看起来一切正常。问题是,如果我发送一封未签名的电子邮件并手动附加一个 smime.p7m 文件,它会欺骗代码认为该电子邮件已签名。

有人对此有解决方案吗?我还可以使用 Outlook Interop 等其他方法。

【问题讨论】:

    标签: vb.net outlook mapi smime


    【解决方案1】:

    Outlook 对象模型始终尝试将签名和加密邮件表示为常规 MailItem 对象。 MessageClass 属性将返回“IPM.Note"。它会从MailItem.MAPIOBJECT 属性返回一个假的IMessage 对象。

    如果您使用的是扩展 MAPI,您可以读取 PR_MESSAGE_CLASS 属性并检查其值是否对应于已签名/加密的消息类之一(例如 "IPM.Note.SMIME.MultipartSigned")。如果您要从 MailItem.MAPIOBJECT 属性中检索 IMessage 对象,请确保打开它。

    您还可以使用Redemption 及其RDOEncryptedMessage 对象 - 它允许使用RDOEncryptedMessage.GetDecryptedMessage 消息解密加密消息以及访问证书属性。

    【讨论】:

      【解决方案2】:

      如果您有一个真正签名的 S/MIME 消息,那么“smime.p7m”附件的Content-Type 值将是application/pkcs7-mime; smime-type=signed-data - 或者- 它的Content-Type 值将是application/pkcs7-signature 和将是 multipart/signed 容器的第二个子 MIME 部分。

      可视化:

      选项 1:

      Content-Type: application/pkcs7-mime; smime-type="signed-data"; name="smime.p7m"
      Content-Disposition: attachment; filename="smime.p7m"
      Content-Transfer-Encoding: base64
      

      选项 2:

      Content-Type: multipart/signed; boundary="some-bounary-string"; protocol="application/pkcs7-signature"
      
      --some-boundary-string
      Content-Type: text/plain
      
      This is the message content that was signed...
      
      --some-boundary-string
      Content-Type: application/pkcs7-signature; name="smime.p7m"
      Content-Disposition: attachment; filename="smime.p7m"
      Content-Transfer-Encoding: base64
      
      ...
      --some-boundary-string--
      

      我不熟悉 Exchange MAPI 包装 API,但应该有一种方法可以获取 Content-Type 值。根据具体情况,您可以检查我上面提到的其他属性,以验证它实际上是签名消息还是只是附件。

      注意:它们也可以是application/x-pkcs7-mimeapplication/x-pkcs7-signature,但除了MIME子类型的前导x-外,逻辑相同。

      【讨论】:

      • 但是如果我发送一封签名的电子邮件并下载它的 smime.p7m 文件,它将包含您所说的所有这些信息,我可以将其重新附加到其他一些电子邮件以制作代码认为它已签名,我只需要识别/修改 smime 文件的正文部分(内容类型:文本/html)并保持相同的证书数据。
      • 你没有任何意义。如果您从 1 条消息中获取 smime.p7m 签名数据并将其添加到具有不同 text/html 内容的另一条消息中,那么它不会神奇地成为签名消息。它甚至不会看起来那样,除非您创建一个包含 text/html 具有正确 Content-Type 的 smime.p7m 数据的多部分/签名容器(如果您尝试使用邮件客户端附加 smime.p7m 文件,它的 Content-Type 为 application/octet-stream,而不是 application/pkcs7-signature - 邮件客户端也不会将其添加到 multipart/signed ,它会将其添加到多部分/混合)
      • 是否有可能以我的知识水平构建一条消息,让客户或图书馆误以为消息看起来已签名,但实际上并非如此?当然可以,但这就是您实现逻辑来验证数字签名的原因。
      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2013-07-16
      相关资源
      最近更新 更多