首页 > 解决方案 > 检查电子邮件是否使用 VB.Net 进行数字签名

问题描述

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

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

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

标签: vb.netoutlookmapismime

解决方案


如果您有一个真正签名的 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-mimeand application/x-pkcs7-signature,但除了x-MIME 子类型的前导之外,逻辑是相同的。


推荐阅读