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 mails signés cryptés


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Envoi de mails signés cryptés
    Bonjour à tous,

    Je dois mettre en place un petit applicatif qui envoie des emails signés et cryptés avec une pièce jointe.
    J'ai trouvé pas mal d'explications là-dessus, et j'arrive à envoyer un e-mail juste signé. J'arrive également à envoyer un e-mail uniquement crypté. Mais quand je veux combiner les deux, ça ne fonctionne pas.

    Voici le code exécuté pour cela :

    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
    68
    69
     
    //Construction du message
    MailMessage message = new System.Net.Mail.MailMessage();
    message.To.Add(destinataire);
    message.From = new MailAddress(expediteur);
    message.Subject = "OBJET";
     
    StringBuilder UnsignedMessage = new StringBuilder();
    UnsignedMessage.Append("MIME-Version: 1.0\r\n");
    UnsignedMessage.Append("Content-Type: multipart/mixed; boundary=boundary-1; protocol=\"application/x-pkcs7-signature\"; micalg = sha1;\r\n");
    UnsignedMessage.Append("\r\n");
    UnsignedMessage.Append("This is an S/MIME signed message\r\n");
    UnsignedMessage.Append("--boundary-1\r\n");
    UnsignedMessage.Append("Content-Type : text/plain\r\n");
    UnsignedMessage.Append("Content-Transfer-Encoding : 7Bit\r\n\r\n");
    UnsignedMessage.Append("Body\r\n");
    UnsignedMessage.Append("\r\n\r\n");
     
    //Ajout de la pièce jointe			
    FileInfo fileInfo = new FileInfo("ma piece jointe");
    UnsignedMessage.Append("--boundary-1\r\n");
    UnsignedMessage.Append("Content-Type : application/octet-stream; file = "+fileInfo.Name+"\r\n");
    UnsignedMessage.Append("Content-Transfer-Encoding: base64\r\n");
    UnsignedMessage.Append("Content-Disposition: attachment; filename="+fileInfo.Name+"\r\n\r\n");
     
    byte[] buff = null;
    FileStream fs = new FileStream("ma piece jointe", FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    long numBytes = fileInfo.Length;
    buff = br.ReadBytes((int)numBytes);
    byte[] bytes = buff;
    String filecontent = Convert.ToBase64String(bytes,Base64FormattingOptions.InsertLineBreaks);
     
    UnsignedMessage.Append(filecontent);
    UnsignedMessage.Append("\r\n");
     
    byte[] messageData = Encoding.ASCII.GetBytes(UnsignedMessage.ToString());
     
    //Signature du message
    ContentInfo content = new ContentInfo(messageData);
     
    SignedCms signedCms = new SignedCms(content);
    CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, SenderCert);
     
    signer.IncludeOption = X509IncludeOption.WholeChain;
     
    signer.Certificates.Add(SenderCert);
     
    Pkcs9SigningTime signingTime = new Pkcs9SigningTime();
    signer.SignedAttributes.Add(signingTime);
     
    signedCms.ComputeSignature(signer);
     
    byte[] signedData = signedCms.Encode();
     
    //Cryptage du message
    content = new ContentInfo(signedData);
    EnvelopedCms envelopedCms = new EnvelopedCms(content);
    CmsRecipient recipients = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, RecipientCert);
    envelopedCms.Encrypt(recipients);
     
    byte[] encryptedBytes = envelopedCms.Encode();
     
    //Envoi du message
    MemoryStream encryptedStream = new MemoryStream(encryptedBytes);
    AlternateView encryptedView = new AlternateView(encryptedStream, "application/x-pkcs7-mime; smime-type=enveloped-data; name=smime.p7m; content-disposition=attachment; fileName=smime.p7m");
    message.AlternateViews.Add(encryptedView);
     
    smtpClient.Send(message);
    Si je ne laisse que la partie "Signature du message", j'ai le résultat attendu :

    Nom : message_signe.png
Affichages : 1026
Taille : 25,6 Ko

    Si je ne laisse que la partie "Cryptage du message", j'ai également le résultat attendu :

    Nom : message_crypte.png
Affichages : 1068
Taille : 27,7 Ko

    Mais en combinant les deux je n'ai pas le résultat escompté.

    Est-ce que quelqu'un saurait éclairer ma lanterne et me dire ce que je ne fais pas correctement ?

    En vous remerciant par avance de votre aide, je vous souhaite une bonne journée.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Peut être que le message est signé à l'intérieur du cryptage ?
    C'est possible de tenter d'inverser l'ordre de cryptage et signature ?

    Je dit ça sans trop comprendre ton code

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'avais effectivement pensé à cette option et j'avais essayé mais ça ne fonctionne pas plus.
    De plus, le destinataire de mon mail fait bien les opérations dans l'ordre décryptage puis vérification de signature de ce que j'ai pu comprendre.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Personne n'a d'idée ? Personne n'a jamais fait d'envoi de mails signés et cryptés ?

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Citation Envoyé par ludom74 Voir le message
    Mais en combinant les deux je n'ai pas le résultat escompté.
    Qu'est-ce que cela signifie ? Est-ce qu'il n'arrive pas à le décrypter ? Est-ce qu'il n'arrive pas à vérifier la signature ?

    L'ordre, c'est bien déchiffrement, puis vérification de la signature (ou création de la signature et chiffrement si on créé le message).

    Personne n'a jamais fait d'envoi de mails signés et cryptés ?
    Si, et c'est un calvaire pour débugger quand ça ne fonctionne pas ! C'est pour cela qu'on a besoin du maximum d'info (en l'occurence, la phase où cela ne fonctionne pas)
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Lorsque je combine les deux, c'est à dire que je signe le message puis que je le crypte, il arrive bien dans ma boîte de réception mais uniquement avec le couche de chiffrement.
    C'est comme si le fait de rajouter le code de cryptage écrasait ce qui était fait pour la signature.
    Du coup mon destinataire reçoit le message, il arrive à le décrypter mais il me renvoie une erreur comme quoi il n'est pas signé correctement.

    Et c'est en testant en me l'envoyant à moi même que je me suis aperçu que juste avec le code de signature, je reçois bien un message signé. Mais dès que j'ajoute le cryptage, je reçois bien un message crypté mais qui n'est plus signé.

    Il doit y avoir quelque chose que je ne fais pas bien dans l'enchaînement des opérations, mais je n'arrive pas à trouver quoi.

    Bonne soirée

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonsoir,

    J'ai regardé un peu ton code. Comme cela, je n'ai rien vu de choquant.

    Je te donne un morceau de code que j'utilise et qui fonctionne, les commentaires sont après :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    /// <summary>
            /// Chiffre et signe le contenu d'un mail
            /// </summary>
            /// <param name="content">Contenu à signer et chiffrer</param>
            /// <param name="signatureCertificate">Certificat à utiliser pour la signature du contenu</param>
            /// <param name="encryptionCertificate">Certificat à utiliser pour le chiffrage du contenu</param>
            /// <returns></returns>
            private static string getSecuredContent(string content, string subject, X509Certificate2 signatureCertificate, X509Certificate2 encryptionCertificate)
            {
                ContentInfo originalInfo = new ContentInfo(Encoding.UTF8.GetBytes(content));
                CmsSigner signer = new CmsSigner(signatureCertificate);
                SignedCms signedEnv = new SignedCms(originalInfo);
                EnvelopedCms cryptedEnv = new EnvelopedCms();
                CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.SubjectKeyIdentifier, encryptionCertificate);
                StringBuilder signedContent = new StringBuilder();
                StringBuilder cryptedContent = new StringBuilder();
     
                signer.SignedAttributes.Add(new Pkcs9SigningTime());
                signedEnv.ComputeSignature(signer);
     
                signedContent.AppendLine("Content-Type: application/pkcs7-mime; name=smime.p7m; smime-type=signed-data");
                signedContent.AppendLine("Content-Transfer-Encoding: base64");
                signedContent.AppendLine("Content-Disposition: attachment; filename=\"smime.p7m\"");
                signedContent.AppendLine("Content-Description: S/MIME Cryptographic Signed Data");
                signedContent.AppendLine();
                signedContent.AppendLine(Convert.ToBase64String(signedEnv.Encode(), Base64FormattingOptions.InsertLineBreaks));
     
                cryptedEnv = new EnvelopedCms(new ContentInfo(Encoding.ASCII.GetBytes(signedContent.ToString())));
                cryptedEnv.Encrypt(recipient);
     
                cryptedContent.AppendLine("Content-Type: application/pkcs7-mime; name=\"smime.p7m\"; smime-type=enveloped-data");
                cryptedContent.AppendLine("Content-Transfer-Encoding: base64");
                cryptedContent.AppendLine("Content-Disposition: attachment; filename=\"smime.p7m\"");
                cryptedContent.AppendLine("Content-Description: S/MIME Encrypted Message");
                cryptedContent.AppendLine("From: =?utf-8?Q?Expediteur");
                cryptedContent.AppendLine("To: rcp.cancerologie@esante-poitou-charentes.fr");
                cryptedContent.AppendLine("Subject: " + subject);
                cryptedContent.AppendLine("MIME-Version: 1.0");
                cryptedContent.AppendLine("Date: " + DateTime.Now.ToString("R"));
                cryptedContent.AppendLine();
                cryptedContent.AppendLine(Convert.ToBase64String(cryptedEnv.Encode(), Base64FormattingOptions.InsertLineBreaks));
                cryptedContent.AppendLine(".");
                return cryptedContent.ToString();
            }
     
            /// <summary>
            /// Envoi un contenu sécurisé
            /// </summary>
            /// <param name="mailContent">Contenu signé et chiffré à envoyer</param>
            /// <param name="toEmail">Adresse e-mail du destinataire</param>
            /// <returns>True si le mail a été envoyé, false sinon</returns>
            internal static bool sendSecuredMail(string mailContent, string toEmail)
            {
                try
                {
                    using (HigLabo.Net.Smtp.SmtpClient smtpClient = new HigLabo.Net.Smtp.SmtpClient(AppInfo.SmtpServer))
                    {
                        SmtpMessage mail = new SmtpMessage();
     
                        smtpClient.HostName = AppInfo.SmtpServer;
                        smtpClient.Port = AppInfo.SmtpPort;
                        //smtpClient.Ssl = true;
                        smtpClient.EncryptedCommunication = SmtpEncryptedCommunication.Ssl;
                        smtpClient.AuthenticateMode = SmtpAuthenticateMode.Login;
                        smtpClient.UserName = AppInfo.SmtpUser;
                        smtpClient.Password = AppInfo.SmtpPassword;
     
                        SendMailResult rs = smtpClient.SendMail(AppInfo.SmtpSender, toEmail, String.Empty, String.Empty, System.Text.Encoding.ASCII.GetBytes(mailContent));
                        Trace.WriteLine(rs.SendSuccessful ? "Message sécurisé envoyé" : "Erreur lors de l'envoi du message sécurisé");
                        Trace.WriteLine(rs.Message);
     
                        return rs.SendSuccessful;
                    }
                }
                catch (Exception e)
                {
                    Trace.WriteLine("=== EXCEPTION ===");
                    Trace.WriteLine(e.ToString());
                    Trace.WriteLine(e.Message);
                    Trace.WriteLine(e.StackTrace);
                    return false;
                }
            }
    Ce code n'utilise pas System.Net.Mail.SmtpClient mais la bibliothèque HigLabo.Net.Smtp. La raison est en est simple : la classe du Framework .Net ne gère pas un mode de connexion, le mode de connexion direct via un canal sécurisé (SMPTS), mais uniquement via STARTTLS (où on établie d'abord une connexion, et ensuite seulement elle est sécurisée). La bibliothèque HigLabo gère ce type de connexion, mais son API peut être un peu différente de celle du framework .Net.

    Je pense que le code est suffisamment explicite. Mais si tel n'est pas le cas, n'hésite pas à poser des questions. J'espère en tout cas que cela t'aidera.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour ta réponse, je vais regarder tout ça.

    Bonne journée.

Discussions similaires

  1. [Outlook] envoie de mail crypté
    Par swissmade dans le forum Outlook
    Réponses: 3
    Dernier message: 24/06/2008, 23h52
  2. Envoi de mail au format Rich-Text
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 29/10/2003, 16h27
  3. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 11h22
  4. Outlook ne se ferme pas après un envoi de mail
    Par Joke dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/06/2003, 17h32
  5. envoi de mail, protocol SMTP langage C
    Par Heimdall dans le forum Développement
    Réponses: 2
    Dernier message: 23/05/2003, 11h22

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