Экспериментировал с отправкой защищенных писем с использованием C # и задавался вопросом, правильно ли я все понял. В настоящее время у меня есть следующая программа:
using System;
using System.Net.Mail;
using System.Net;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using System.Net.Security;
namespace Geekality.SecureEmail
{
class Program
{
static bool OurCertificateValidation(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
var actualCertificate = X509Certificate.CreateFromCertFile("example.com.cert");
return certificate.Equals(actualCertificate);
}
static void Main(string[] args)
{
// Register our own certificate validation
ServicePointManager.ServerCertificateValidationCallback = OurCertificateValidation;
// Message
var from = new MailAddress("me@example.com", "Me");
var to = new MailAddress("you@example.com", "Myself");
var message = new MailMessage(from, to)
{
Subject = "Greetings!",
Body = "How are you doing today?",
};
// Create client
var client = new SmtpClient("smtp.example.com")
{
EnableSsl = true,
Credentials = new NetworkCredential
{
UserName = "me@example.com",
Password = "password",
},
};
// Try to send
using (client)
{
try
{
client.Send(message);
Console.WriteLine("Message sent!");
}
catch (AuthenticationException e)
{
Console.WriteLine("Authentication failed:");
Console.WriteLine(e.Message);
}
catch (SmtpException e)
{
Console.WriteLine("SMTP error:");
Console.WriteLine(e.Message);
}
}
Console.ReadKey(true);
}
}
}
Хотя данные были изменены на примерные значения. В любом случае, похоже, это хорошо работает из того, что я вижу. Любые комментарии о том, что я сделал? Особенно в том, как я делаю проверку сертификата. Это хороший способ сделать это? Или я пропустил что-то настолько плохое, что я мог бы также отправить письмо, не используя SSL?
Причина, по которой я выполняю проверку самостоятельно, заключается в том, что проверка по умолчанию завершилась неудачно, поскольку это сертификат, выданный самим собой, и почтовый домен, который я использую, отличается от используемого в сертификате. Я использую mail.mydomain.com , в то время как домен в сертификате выглядит как mywebhost.com . Поэтому я получил файл сертификата от Opera, используя его почтовый клиент, и сохранил его, чтобы я мог сравнить его с файлом, полученным при попытке отправить письмо. Это безопасный и хороший способ сделать эту проверку? Я также знаю хэш фактического сертификата и пытался использовать его для сравнения с тем, который я получаю при отправке электронного письма. Это также работает и было немного легче сделать, хотя в строках кода это почти то же самое. Просто сравнивая со строкой вместо файла. Является ли один из этих способов лучше, чем другой?