如何验证 SMIME multipart/signed application/x-pkcs7-signature 邮件的签名
Howto Verify Signature of a SMIME multipart/signed application/x-pkcs7-signature Mail
我正在开发一个更大的应用程序,它通过 POP3、IMAP 或通过从 .msg 文件导入(从 Outlook 导出或从 Outlook 拖过来)接收电子邮件。
最近我收到了一封带有附件的电子邮件 "smime.p7m"。
经过进一步检查,原来是一个带有
的 MIME 消息
Content-Type: multipart/signed;
protocol="application/x-pkcs7-signature";
在其他部分中,它包含一节
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64 Content-Disposition: attachment;
filename="smime.p7s"
我尝试使用 OpenPop
作为 MIME 消息解析器来验证此签名,并使用 SignedCms
来检查签名。我的尝试是这样的:
var datapart = OpenPop.MessagePart[...];
var part3 = OpenPop.MessagePart[3]; // the signature
var ci = new ContentInfo(datapart);
var sCMS = new SignedCms(ci, detached: true);
sCMS.Decode(part3.Body);
sCMS.CheckHash();
sCMS.CheckSignature(verifySignatureOnly:true);
但无论我用什么 datapart
我总是得到
System.Security.Cryptography.CryptographicException
The hash value is not correct.
如何验证签名?
有没有更好的方法?
最简单的方法是使用 MimeKit(它不仅是开源的,而且可以免费用于商业用途)。
由于您只关心验证签名,因此您可以只使用 MimeKit.Cryptography.TemporarySecureMimeContext
而不是设置自己的(就像 README 和其他文档所说的那样)。
通常,当您收到通过 S/MIME 签名的邮件时,它几乎总是根级 MIME 部分即 multipart/signed
部分,这使得这更容易一些(迈向验证签名是定位 multipart/signed
部分)。
var signed = message.Body as MultipartSigned;
if (signed != null) {
using (var ctx = new TemporaryMimeContext ()) {
foreach (var signature in signed.Verify (ctx)) {
try {
bool valid = signature.Verify ();
// If valid is true, then it signifies that the signed
// content has not been modified since this particular
// signer signed the content.
//
// However, if it is false, then it indicates that the
// signed content has
// been modified.
} catch (DigitalSignatureVerifyException) {
// There was an error verifying the signature.
}
}
}
}
您可以在 www.mimekit.net/docs 找到 API MimeKit 文档。
我正在开发一个更大的应用程序,它通过 POP3、IMAP 或通过从 .msg 文件导入(从 Outlook 导出或从 Outlook 拖过来)接收电子邮件。
最近我收到了一封带有附件的电子邮件 "smime.p7m"。 经过进一步检查,原来是一个带有
的 MIME 消息Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
在其他部分中,它包含一节
Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s"
我尝试使用 OpenPop
作为 MIME 消息解析器来验证此签名,并使用 SignedCms
来检查签名。我的尝试是这样的:
var datapart = OpenPop.MessagePart[...];
var part3 = OpenPop.MessagePart[3]; // the signature
var ci = new ContentInfo(datapart);
var sCMS = new SignedCms(ci, detached: true);
sCMS.Decode(part3.Body);
sCMS.CheckHash();
sCMS.CheckSignature(verifySignatureOnly:true);
但无论我用什么 datapart
我总是得到
System.Security.Cryptography.CryptographicException The hash value is not correct.
如何验证签名?
有没有更好的方法?
最简单的方法是使用 MimeKit(它不仅是开源的,而且可以免费用于商业用途)。
由于您只关心验证签名,因此您可以只使用 MimeKit.Cryptography.TemporarySecureMimeContext
而不是设置自己的(就像 README 和其他文档所说的那样)。
通常,当您收到通过 S/MIME 签名的邮件时,它几乎总是根级 MIME 部分即 multipart/signed
部分,这使得这更容易一些(迈向验证签名是定位 multipart/signed
部分)。
var signed = message.Body as MultipartSigned;
if (signed != null) {
using (var ctx = new TemporaryMimeContext ()) {
foreach (var signature in signed.Verify (ctx)) {
try {
bool valid = signature.Verify ();
// If valid is true, then it signifies that the signed
// content has not been modified since this particular
// signer signed the content.
//
// However, if it is false, then it indicates that the
// signed content has
// been modified.
} catch (DigitalSignatureVerifyException) {
// There was an error verifying the signature.
}
}
}
}
您可以在 www.mimekit.net/docs 找到 API MimeKit 文档。