我想知道是否可以使用VB.Net检查电子邮件是否经过数字签名,以及谁是证书的颁发者。
使用扩展的MAPI包装器和加密技术,我能够从电子邮件中获得smime.p7m附件,并从中获得证书信息(包括颁发者),所以看起来一切都正常。问题是,如果我发送了一封未签名的电子邮件,并手动附加了一个smime.p7m文件,它将欺骗代码,使其认为该电子邮件已签名。
有人有解决这个问题的办法吗?我也可以使用其他方法,如Outlook Interop。
发布于 2018-11-01 07:30:52
Outlook对象模型始终尝试将签名和加密的邮件表示为常规MailItem对象。MessageClass属性将返回"IPM.Note"“。它甚至可以从MailItem.MAPIOBJECT属性返回一个伪IMessage对象。
如果您使用的是扩展的MAPI,您可以读取PR_MESSAGE_CLASS属性并检查它的值是否对应于一个签名/加密的消息类(例如"IPM.Note.SMIME.MultipartSigned")。如果要从MailItem.MAPIOBJECT属性中检索IMessage对象,请确保将其解包。
您还可以使用Redemption和它的RDOEncryptedMessage对象-它允许使用RDOEncryptedMessage.GetDecryptedMessage消息解密加密消息以及访问证书属性。
发布于 2018-11-11 03:17:33
如果您有一个真正签名的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 wrapper API,但应该有一种方法来获取Content-Type值。根据这是什么,您可以检查我上面提到的其他属性,以验证它实际上是一封签名邮件还是仅仅是一个附件。
注意:它们也可以是application/x-pkcs7-mime和application/x-pkcs7-signature,但除了MIME子类型的前导x-之外,逻辑是相同的。
https://stackoverflow.com/questions/53092614
复制相似问题