我想知道是否可以使用VB.Net检查电子邮件是否经过数字签名以及谁是证书的颁发者。
使用扩展的MAPI包装程序和密码技术,我能够从电子邮件中获取smime.p7m附件,并从中获取证书信息(包括发行者),因此似乎一切正常。问题是,如果我发送未签名的电子邮件并手动附加一个smime.p7m文件,它将欺骗代码,使您认为电子邮件已签名。
有人对此有解决方案吗?我还可以使用其他方法,例如Outlook Interop。
答案 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-data
值Content-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-Type
和application/x-pkcs7-mime
,但是除了MIME子类型的前导application/x-pkcs7-signature
之外,其逻辑是相同的。