Send encrypted email using S/MIME
In this article we’ll show how to send digitally encrypted and signed emails (S/MIME) using Mail.dll .NET email component.
S/MIME (Secure/Multipurpose Internet Mail Extensions) is a standard for public key encryption and signing of MIME data.
S/MIME was originally developed by RSA Data Security Inc. Specification uses Cryptographic Message Syntax, an IETF specification that is identical in most respects with PKCS #7.
S/MIME provides the following cryptographic security services for electronic messaging applications: authentication, message integrity, non-repudiation of origin (using digital signatures), privacy and data security (using encryption). S/MIME specifies the MIME type application/pkcs7-mime (smime-type “enveloped-data”) for data enveloping (encrypting) where the whole (prepared) MIME entity to be enveloped is encrypted and packed into an object which subsequently is inserted into an application/pkcs7-mime MIME entity.
Encryption using MailBuilder
// C#
MailBuilder builder = new MailBuilder();
builder.Html = "<html><body>Encrypted and signed</body></html>";
builder.Subject = "Encrypted and signed";
builder.From.Add(new MailBox("email@in-the-certificate.com", "Alice"));
builder.To.Add(new MailBox("bob@mail.com", "Bob"));
builder.AddAttachment(@"c:\report_2014.pdf");
builder.SignWith(new X509Certificate2("SignCertificate.pfx", ""));
builder.EncryptWith(new X509Certificate2("EncryptCertificate.pfx", ""));
builder.EncryptWith(new X509Certificate2("BobsCertificate.pfx", ""));
IMail email = builder.Create();
' VB.NET
Dim builder As New MailBuilder()
builder.Html = "<html><body>Encrypted and signed</body></html>"
builder.Subject = "Encrypted and signed"
builder.From.Add(New MailBox("email@in-the-certificate.com", "Alice"))
builder.[To].Add(New MailBox("bob@mail.com", "Bob"))
builder.AddAttachment("c:\report_2014.pdf")
builder.SignWith(New X509Certificate2("SignCertificate.pfx", ""))
builder.EncryptWith(New X509Certificate2("EncryptCertificate.pfx", ""))
builder.EncryptWith(New X509Certificate2("BobsCertificate.pfx", ""))
Dim email As IMail = builder.Create()
Remember to encrypt your emails with both sender’s and receiver’s certificates.
This way both parties are able to decrypt such emails.
Encryption using fluent interface
// C# version
IMail email = Mail
.Html("<html><body>Encrypted and signed</body></html>")
.Subject("Encrypted and signed")
.From(new MailBox("email@in-the-certificate.com", "Alice"))
.To(new MailBox("bob@mail.com", "Bob"))
.AddAttachment(@"c:\report_2014.pdf")
.SignWith(new X509Certificate2("SignCertificate.pfx", ""))
.EncryptWith(new X509Certificate2("EncryptCertificate.pfx", ""))
.EncryptWith(new X509Certificate2("BobsCertificate.pfx", ""))
.Create();
' VB.NET
Dim email As IMail = Mail _
.Html("<html><body>Encrypted and signed</body></html>") _
.Subject("Encrypted and signed") _
.From(New MailBox("email@in-the-certificate.com", "Alice")) _
.To(New MailBox("bob@mail.com", "Bob")) _
.AddAttachment("c:\report_2014.pdf") _
.SignWith(New X509Certificate2("SignCertificate.pfx", "")) _
.EncryptWith(New X509Certificate2("EncryptCertificate.pfx", "")) _
.EncryptWith(New X509Certificate2("BobsCertificate.pfx", "")) _
.Create()
Common errors you may encounter
- Please use the PersistKeySet flag when loading from file (new X509Certificate2(_certificatePath, “”, X509KeyStorageFlags.PersistKeySet);) and adding to store
- “Bad key” exception message means that certificate was not for key exchange – makecert needs an extra parameter to create certificate that can be used for symmetric algorithm key exchange: -sky exchange.
- “The enveloped-data message does not contain the specified recipient.” means that certificate with the private key is not deployed into the current account/local machine personal store, or not in the certificates list
Create test certificate
You can use following commands in VisualStudio Command Prompt to create test certificate:
makecert.exe -pe -r -sv Test_Keys.pvk -n "CN=John Doe,E=email@in-the-certificate.com" -sky exchange Test.cer
pvk2pfx.exe -pvk Test_Keys.pvk -spc Test.cer -pfx Test.pfx
Importing private/public keys or certificates in PEM, CER formats.
Sending encrypted email using SMTP
Now we can connect to SMTP server and send the email we recently created:
// C#
using (Smtp client = new Smtp())
{
client.Connect("smtp.example.com"); // or ConnectSSL
client.UseBestLogin("user", "password");
client.SendMessage(email);
client.Close();
}
' VB.NET
Using client As New Smtp()
client.Connect("smtp.example.com") ' or ConnectSSL
client.UseBestLogin("user", "password")
client.SendMessage(email)
client.Close()
End Using
By default Mail.dll uses TrippleDES (3-DES) for encryption and SHA-1 alghoritm for signing. You can change those settings and choose different signature and encryption algorithm while sending S/MIME encrypted email message.
January 15th, 2016 at 12:44
[…] Send encrypted email using S/MIME […]