vb.net - 检查电子邮件是否使用 VB.Net 进行数字签名
问题描述
我想知道是否可以使用 VB.Net 检查电子邮件是否经过数字签名以及证书的颁发者是谁。
使用 Extended MAPI Wrapper 和 Cryptography,我能够从电子邮件中获取 smime.p7m 附件并从中获取证书信息(包括颁发者),所以看起来一切正常。问题是,如果我发送一封未签名的电子邮件并手动附加一个 smime.p7m 文件,它会欺骗代码认为该电子邮件已签名。
有人对此有解决方案吗?我还可以使用其他方法,例如 Outlook 互操作。
解决方案
如果您有一个真正签名的 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-mime
and application/x-pkcs7-signature
,但除了x-
MIME 子类型的前导之外,逻辑是相同的。
推荐阅读
- r - 在 R 中拆分字符串以获得多个符号
- assembly - 虚拟工作室空间分配过度
- sql - SQL - 使用 LAG 并基于另一列更新表
- javascript - React - 如何在浏览器中处理昂贵的任务(画布操作)?
- acumatica - 如何在 2020R2 的客户屏幕上将事件附加到住宅交付复选框?
- cloudkit - 云套件:如何仅从您的联系人组获取公共数据库订阅通知
- python - 使用 Python 进行缓慢的 SQLite 更新
- c# - c# group by first word
- visual-studio - 用于 Javascript/AJAX 的 Visual Studio Code 镜头
- javascript - Discord Bot 多次响应事件