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

检查电子邮件是否使用VB.Net进行数字签名,vb.net,outlook,mapi,smime,Vb.net,Outlook,Mapi,Smime,我想知道是否可以使用VB.Net检查电子邮件是否经过数字签名,以及谁是证书的颁发者 使用扩展MAPI包装器和加密技术,我能够从电子邮件中获取smime.p7m附件,并从中获取证书信息(包括颁发者),因此看起来一切正常。问题是,如果我发送一封未签名的电子邮件并手动附加一个smime.p7m文件,它会诱使代码认为该电子邮件已签名 有人能解决这个问题吗?我还可以使用其他方法,如Outlook Interop。Outlook对象模型始终尝试将已签名和加密的邮件表示为常规的邮件项对象。MessageCla

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

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


有人能解决这个问题吗?我还可以使用其他方法,如Outlook Interop。

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

如果您使用的是扩展MAPI,则可以读取
PR\u MESSAGE\u CLASS
属性,并检查其值是否对应于其中一个已签名/加密的邮件类(例如
“IPM.Note.SMIME.MultipartSigned”
)。如果要从
MailItem.MAPIOBJECT
属性检索
IMessage
对象,请确保将其展开


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

如果您有一条真正签名的S/MIME消息,“smime.p7m”附件的
内容类型
值为
application/pkcs7 MIME;smime type=签名数据
-或-它将具有
内容类型
应用程序/pkcs7签名
,并且将是
多部分/签名
容器的第二个子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,但应该有一种方法来获取
内容类型
值。根据具体情况,您可以检查我上面提到的其他属性,以验证它实际上是已签名的消息还是仅是附件


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

但是如果我发送一封签名电子邮件并下载它的smime.p7m文件,它将包含您所说的所有信息,我可以将它重新附加到其他电子邮件中,使代码认为它已签名,我只需识别/修改smime文件的主体部分(内容类型:text/html)并保留相同的证书数据。你没有任何意义。如果您从一条消息中获取smime.p7m签名数据,并将其添加到另一条具有不同文本/html内容的消息中,那么它就不会神奇地成为签名消息。除非您创建一个包含文本/html和smime.p7m数据并具有正确内容类型的多部分/签名容器,否则它甚至不会这样看(如果您尝试使用邮件客户端附加smime.p7m文件,它的内容类型将为application/octet stream,而不是application/pkcs7签名-邮件客户端也不会将其添加到多部分/签名,它会将其添加到多部分/混合签名)有没有可能让我这样的知识水平的人构建一条消息,让客户机或库误以为消息看起来有签名,而实际上没有签名?当然,但这就是为什么要实现逻辑来验证数字签名。