C # Проверка электронной почты S / Mime с отдельной подписью - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь проверить подпись электронного письма, которое было отправлено с цифровой подписью в виде открытого текста.К сожалению, я получу только исключение CryptographicException: The hash value is not correct.Почта выглядит примерно так:

MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="SHA1";
 boundary="----boundary1"
Content-Transfer-Encoding: base64

This is a multi-part message in MIME format.

------boundary1
Content-Type: multipart/mixed; boundary="----boundary2"


------boundary2
Content-Type: multipart/alternative; boundary="----boundary3"


------boundary3
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

This is only a test message to demonstrate the s/mime functionality!


------boundary3
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas=2Emicrosoft=2Ecom/office/2004/12/omml" xmlns=3D"h=
ttp://www=2Ew3=2Eorg/TR/REC-html40"><head><META HTTP-EQUIV=3D"Content-Type"=
 CONTENT=3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=
=3D"Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
    {font-family:"Cambria Math";
    panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
    {font-family:Calibri;
    panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p=2EMsoNormal, li=2EMsoNormal, div=2EMsoNormal
    {margin:0cm;
    margin-bottom:=2E0001pt;
    font-size:11=2E0pt;
    font-family:"Calibri",sans-serif;
    mso-fareast-language:EN-US;}
a:link, span=2EMsoHyperlink
    {mso-style-priority:99;
    color:#0563C1;
    text-decoration:underline;}
a:visited, span=2EMsoHyperlinkFollowed
    {mso-style-priority:99;
    color:#954F72;
    text-decoration:underline;}
span=2EEmailStyle17
    {mso-style-type:personal-compose;
    font-family:"Calibri",sans-serif;
    color:windowtext;}
=2EMsoChpDefault
    {mso-style-type:export-only;
    font-family:"Calibri",sans-serif;
    mso-fareast-language:EN-US;}
@page WordSection1
    {size:612=2E0pt 792=2E0pt;
    margin:70=2E85pt 70=2E85pt 2=2E0cm 70=2E85pt;}
div=2EWordSection1
    {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DDE-CH link=3D"#0563C1=
" vlink=3D"#954F72"><div class=3DWordSection1><p class=3DMsoNormal><span la=
ng=3DEN-US>This is only a test message to demonstrate the s/mime functional=
ity!<o:p></o:p></span></p></div></body></html>
------boundary3--

------boundary2
Content-Type: text/plain; name="Attachment.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="Attachment.txt"

Ein Attachment zum Testen. Hallo Test.
------boundary2
Content-Type: image/bmp; name="Attachment_BMP.bmp"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Attachment_BMP.bmp"

Qk2iCAAAAAAAADYAAAAoAAAAQQAAAAsAAAABABgAAAAAAGwIAADEDgAAxA4AAAAAAAAAAAAA/Pz8
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8APz8/ABls9iOOfz8/Pz8/Pz8/Pz8/DmO2LNlAPz8/ABlswAA
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8
/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/AA=
------boundary2--

------boundary1
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIG8zCCAwUw
ggHtoAMCAQICEBwrUfJSoOmsSVa9IcsQo8AwDQYJKoZIhvcNAQELBQAwFTETMBEGA1UEAxMKS09D
SCBJVCBDQTAeFw0xNzA3MDQxMzAxNTVaFw0yNzA3MDQxMzExNTRaMBUxEzARBgNVBAMTCktPQ0gg
SVQgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnG3s8nINQ2hLiATSRLpL24L/q
nF2x7+1ywcRarVMPPwPty3jZZfgSehjx6k4ZDbdn1Efh2P15a+DzRablxHawaHPjwXTh9yOt0QHb
Ia8nJ7sRQcdApkNXS1PXznVLwC7MBicPgA5iZU+KzpBJeZADFFu1fUVifwG7dDIu4W9Y9U4bvnM5
D0v7+4I0uLujTVKLRkB4tR1kGL9ufr+juQdIP/MaWYJyzNaqo42xOIJLSNfVRykqmqj5TIoBGmvW
AAAAACYwPQYLKoZIhvcNAQkQAgsxLqAsMBUxEzARBgNVBAMTCktPQ0ggSVQgQ0ECEx0AAAAm2YZX
1lLNNU8AAAAAACYwgZMGCSqGSIb3DQEJDzGBhTCBgjALBglghkgBZQMEASowCwYJYIZIAWUDBAEW
MAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBAjAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAw
BwYFKw4DAhowCwYJYIZIAWUDBAIDMAsGCWCGSAFlAwQCAjALBglghkgBZQMEAgEwDQYJKoZIhvcN
AQEBBQAEgYAs7lxwye9QYSvvyl0PBcZeQoyndSvDd+/KUkY4fTXn+DEk8+rDYA2ZYUCaj5rEqV75
u+tjDa4G5k0D4Os5/WlHg/1imwXE+RlxxMEazR3H6aaL5OlXcBx3R6ruP6QMHpBTG3WQ1n3CU2Pt
+Pj956yJtikctQz14UKJxEHyjOuYiAAAAAAAAA==
------boundary1--


Я использую следующий пример кода для проверки подписи:

var mail = File.ReadAllBytes("email.eml");
var contentInfo = new ContentInfo(mail);
var signedCms = new SignedCms(contentInfo, true);

// The mime part with content-type application/pkcs7-signature 
var signature = Convert.FromBase64String("MIAGCS.........");
// Some import code for certificates import omitted for brevity

signedCms.Decode(signature);
signedCms.CheckSignature(x509col, true);

Поэтому моя проблема состоит в том, чтобы узнать, какая часть сообщения электронной почты должнабыть передано конструктору ContentInfo.Для моего понимания я должен передать все от Content-Type: multipart / mixed до последнего --boundary2--.Кто-нибудь делал это раньше и может указать мне правильное направление?

Кстати, у меня есть работающий пример без отдельной подписи, но, к сожалению, наиболее часто используемый случай - с отдельной подписью.

...