23 Stimmen

Wie signiere ich Domainkeys/DKIM E-Mails mit dem C# SMTP-Client?

Ich habe ein Programm in C# geschrieben, das E-Mails versendet. Jetzt habe ich die Anforderung, ausgehende E-Mails mit Dominkeys/DKIM zu signieren, aber ich bin mir nicht sicher, wie das geht.

Ich habe alle Schlüssel eingerichtet, aber ich weiß nicht, wie ich sie erhalten und in den E-Mail-Header einbeziehen kann.

17voto

jstedfast Punkte 31645

Es gibt ein grundlegendes Problem beim Versuch, DKIM-Signaturen mit System.Net.Mail.MailMessage und System.Net.Mail.SmtpClient durchzuführen, nämlich dass Sie zur Signierung der Nachricht die internen Strukturen von SmtpClient durchsuchen müssen, um den Nachrichtentext als einen der Schritte zur Erzeugung des DKIM-Signatur-Headers zu hashen. Das Problem tritt auf, wenn Sie alternative Ansichten oder Anhänge haben, da SmtpClient jedes Mal neue multipart-Grenzen generiert, wenn es die Nachricht schreibt, was den Textkörperhash und somit die DKIM-Signatur-Validität unterbricht.

Um dieses Problem zu umgehen, können Sie die Open-Source-Bibliotheken MimeKit und MailKit für .NET als alternatives Framework zur Verwendung von System.Net.Mail verwenden.

Um eine DKIM-Signatur zu einer Nachricht in MimeKit hinzuzufügen, könnten Sie etwas Ähnliches wie folgt tun:

MimeMessage message = MimeMessage.CreateFromMailMessage(mailMessage);
HeaderId[] headersToSign =  new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date };

string domain = "beispiel.net";
string selector = "brisbane";

DkimSigner signer = new DkimSigner ("C:\my-dkim-key.pem", domain, selector) 
{
   SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1,
   AgentOrUserIdentifier = "@eng.example.com",
   QueryMethod = "dns/txt",      
};

// Bereiten Sie den Nachrichtentext darauf vor, über einen 7-Bit-Transport (wie z.B. ältere Versionen von SMTP) gesendet zu werden. Dies ist SEHR wichtig, da die Nachricht nicht mehr geändert werden kann, nachdem sie DKIM-signiert wurde!
//
// Hinweis: Wenn der SMTP-Server, über den Sie die Nachricht senden, die 8BITMIME-Erweiterung unterstützt, können Sie stattdessen `EncodingConstraint.EightBit` verwenden.
message.Prepare (EncodingConstraint.SevenBit);

message.Sign (signer, headersToSign, 
    DkimCanonicalizationAlgorithm.Relaxed, 
    DkimCanonicalizationAlgorithm.Simple);

Um die Nachricht mit MailKit zu senden, könnten Sie etwas Ähnliches wie folgt tun:

using (var client = new MailKit.Net.Smtp.SmtpClient ()) {
    client.Connect ("smtp.gmail.com", 465, true);
    client.Authenticate ("benutzername", "passwort");
    client.Send (message);
    client.Disconnect (true);
}

Hoffentlich hilft das.

6voto

Damien McGivern Punkte 3774

Siehe https://github.com/dmcgiv/DKIM.Net Es handelt sich um eine DomainKeys Identified Mail (DKIM) Implementierung für .Net, die in C# geschrieben ist - damit können Sie MailMessage-Objekte signieren.

2voto

johngrinder Punkte 422

Verwenden Sie http://www.mimekit.org

Nicht nur erlaubt es die Verwendung von DKIM zum Signieren, auch können Sie S/MIME-Zertifikate, PGP-Zertifikate und mehr einbinden. Außerdem handelt es sich um eine sehr reife Bibliothek - die einzige, die ich gefunden habe, die fremde Sprachen (abgesehen von Englisch) korrekt verarbeitet, da sie vollständig und gründlich unter Berücksichtigung von Unicode codiert ist.

Es ist kostenlos und Open Source.

2voto

Bart VdA Punkte 499

Dies hat das Problem für mich gelöst, als ich Mailenable als SMTP-Relay-Server verwendet habe.

http://www.mailenable.com/kb/content/article.asp?ID=ME020700

Beim Erstellen des DKIM-TXT-Eintrags auf dem Domainnamen nicht vergessen, den aktiven Selector als Präfix zu verwenden => yourselector._domainkey.yourdomainname.be

1voto

Yannis Punkte 5817

Wenn Sie den Text des MailMessage mit DKIM signieren möchten, ist DKIM.NET großartig. Wenn Sie alternative Ansichten in Ihrer Nachricht haben möchten, konnte ich keine Lösung finden und habe meine eigene (Open-Source mit den üblichen Haftungsausschlüssen) geschrieben, die unter https://github.com/yannispsarras/DKIM-AlternativeViews gefunden werden kann

Ich verstehe, dass dies ein ziemlich alter Thread ist, aber ich dachte, es könnte jemandem helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X