Bonjour,

Je travaille sur un projet de client de messagerie pouvant envoyer des messages selon la norme S/MIME.

J'ai trouvé beaucoup d'exemples de code traitant de la création de la signature et du cryptage. Cependant, dans la plupart des cas, l'intégration dans un email n'est pas traitée, ou alors le code ne fonctionne pas correctement.
Voici les principaux problèmes auxquels je me heurte pour l'envoi de messages signés :
  1. L'utilisation de la classe MailMessage ne permet pas de modifier le content-type de l'email (seulement celui des pièces jointes ou des vues alternatives). J'ai essayé d'ajouter un header avec pour clé "Content-Type", mais cela pose deux problèmes :
    Comment lui transmettre la valeur pour "boundary" (qui apparemment n'est pas encore définie)
    • Comment supprimer le content-type définit automatiquement

    • Il y a-t-il une solution plus simple pour redéfinir le content-type principal de l'email?


  2. J'ai fait plusieurs tests en utilisant Thunderbird pour la réception des messages. Après avoir bidouillé le fichier .eml pour résoudre les points évoqués plus haut, j'arrive à faire en sorte qu'il reconnaisse l'email comme étant signé. Cependant, il m'indique que la signature n'est pas valide. Je pense que c'est parce que lors de la création de la signature, je ne lui transmets que le texte brut contenant le corps de mon message (je n'ai pas encore géré les pièces jointes). Cependant, ne faudrait-il pas intégrer les en-têtes MIME? Si oui, où commencer et comment faire?

    Voici le code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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];
            }
  3. En ce qui concerne l'envoi de messages cryptées, j'utilise une pièce jointe. Cependant, la classe MailMessage ajoute automatiquement une partie "Text/Plain" vide qui, une fois de plus, pose problème concernant la réception de ces messages. Il y a-t-il un moyen de supprimer cette partie vide?


Je suis débutante en programmation et je rate peut-être quelque chose. Merci d'avance pour toute aide que vous pourrez m'apporter sur l'un des ces problèmes.

Bonne journée.