检查电子邮件是否使用VB.Net进行了数字签名

时间:2018-10-31 22:07:29

标签: vb.net outlook mapi smime

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

使用扩展的MAPI包装程序和密码技术,我能够从电子邮件中获取smime.p7m附件,并从中获取证书信息(包括发行者),因此似乎一切正常。问题是,如果我发送未签名的电子邮件并手动附加一个smime.p7m文件,它将欺骗代码,使您认为电子邮件已签名。

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

2 个答案:

答案 0 :(得分:1)

Outlook对象模型始终尝试将签名和加密的邮件表示为常规MailItem对象。 MessageClass属性将返回“ IPM.Note"。它甚至可以从IMessage属性返回伪造的MailItem.MAPIOBJECT对象。

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

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

答案 1 :(得分:1)

如果您具有真正签名的S / MIME消息,则“ smime.p7m”附件将具有Content-Type的{​​{1}}值-或者-将具有application/pkcs7-mime; smime-type=signed-dataContent-Type,它将是application/pkcs7-signature容器的第二个子MIME部分。

可视化:

选项1:

multipart/signed

选项2:

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

我不熟悉Exchange MAPI包装器API,但是应该有一种获取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-- 值的方法。根据具体情况,您可以检查我上面提到的其他属性,以验证它实际上是已签名的邮件还是只是附件。

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