1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
private MailMessage EnvoyerEmailSigne()
{
// Construction de la base de l'email
MailMessage monCourriel = new MailMessage();
monCourriel.From = new MailAddress(Properties.Settings.Default.addEmailUser);
foreach (MailAddress addTo in GetAdresses(tbxTo))
{
monCourriel.To.Add(addTo);
}
foreach (MailAddress addCC in GetAdresses(tbxCC))
{
monCourriel.CC.Add(addCC);
}
foreach (MailAddress addBcc in GetAdresses(tbxBCC))
{
monCourriel.Bcc.Add(addBcc);
}
monCourriel.Subject = tbxObjet.Text;
string body = rtbxBody.richTextBox.Text;
monCourriel.Body = body;
byte[] texteBrut = Encoding.Default.GetBytes(body);
byte[] texteSigne = SignerMessage(texteBrut);
MemoryStream ms = new MemoryStream(texteSigne);
ContentType ct = new ContentType();
ct.Name ="smime.p7s";
ct.MediaType = "application/x-pkcs7-signature";
ct.Parameters.Add ("smime-type", "signed-data");
AlternateView av = new AlternateView(ms, ct);
av.TransferEncoding = TransferEncoding.Base64;
av.ContentType.Boundary = "----=_NextPart_000_0015_01C93F26.94283560";
monCourriel.Headers.Add("content-type", "multipart/signed;" +
"protocol=\"application/x-pkcs7-signature\";" +
"micalg=SHA1;" +
"boundary=" + monCourriel.AlternateViews[0].ContentType.Boundary); //Ne fonctionne pas car la valeur "boundary" principale
return monCourriel;
}
private byte[] SignerMessage(byte[] msg)
{
byte[] msgSigne = SignMsg(msg, Program.myCache.myCert, true);
X509Certificate2 myCert = GetMyCert();
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber, contentInfo, true);
CmsSigner expediteur = new CmsSigner(myCert);
expediteur.DigestAlgorithm.FriendlyName = "SHA-1";
signedCms.ComputeSignature(expediteur, false);
msgSigne = signedCms.Encode();
return msgSigne;
}
private void GetMyCert()
{
X509Store magasin = new X509Store(StoreName.My, StoreLocation.CurrentUser);
magasin.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection certifs = magasin.Certificates.Find(X509FindType.FindBySerialNumber, _certSerialNber, true);
magasin.Close();
return certifs[0];
} |
Partager