IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Envoi de messages emails signés et/ou cryptés


Sujet :

C#

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Envoi de messages emails signés et/ou cryptés
    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.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    jette un oeil sur la propriété AlternateViews de la classe MailMessage
    ça permet de définir plusieurs corps de message, en précisant leur content-type

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse Tomlev!

    En fait je connaissais la propriété AlternateViews, mais lorsqu'on a du texte dans le body de MailMessage ou une pièce jointe, utiliser alternateViews ne permet que de rajouter une vue alternative, et non de remplacer ou modifier celle "par défaut".

    Suite à ton post, j'ai quand même été rechercher de ce côté là, et effectivement, j'ai trouvé une solution satisfaisante pour mes points 1. et 2. :

    Il faut construire manuellement dans un string tout le contenu : message brut et/ou HTML, pièces jointes et signature (avec les en-têtes MIME incluses), puis le convertir en stream pour le passer dans le constructeur d'une nouvelle AlternateView.


    Par contre, il me reste le problème de savoir quel contenu utiliser pour la signature afin que la valeur de hachage corresponde avec celle qui sera calculée à la réception de l'email. Je vais faire des tests en tâtonnant un peu. Mais si quelqu'un a déjà travaillé avec S/MIME, peut-être pourront-ils m'éclairer...

    Merci d'avance.

Discussions similaires

  1. Envoi de message
    Par bendev dans le forum ASP
    Réponses: 5
    Dernier message: 11/10/2004, 11h40
  2. Envoi de message entre 2 applications
    Par floweez dans le forum Windows
    Réponses: 9
    Dernier message: 30/06/2004, 16h34
  3. [MFC] Envoi de message
    Par leskritiques dans le forum MFC
    Réponses: 5
    Dernier message: 29/04/2004, 11h26
  4. Réponses: 13
    Dernier message: 14/01/2004, 16h35
  5. Envoi de messages MS DOS avec le IP
    Par asphp dans le forum Développement
    Réponses: 6
    Dernier message: 07/01/2004, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo