"Віддалений сертифікат недійсний відповідно до процедури перевірки." за допомогою SMTP-сервера Gmail


221

Я отримую цю помилку:

Віддалений сертифікат недійсний відповідно до процедури перевірки.

всякий раз, коли я намагаюся надсилати електронну пошту за допомогою SMTP-сервера Gmail у своєму коді C #. Чи може хтось вказати мені в правильному напрямку для вирішення цієї проблеми?

Далі йде стек стека ...

at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at BulkEmail.frmemail.mailsending(String toaddress, String fromaddress, String fromname, String subject, String pwd, String attachements, String mailmessage, String htmlmessage, Int32 i, Int32 j, String replytoaddress)

1
Чи можете ви розповісти більше про ваш конфігурацію для використання SMTP-серверів Gmail? Моя вдала здогадка: Ви можете розповісти більше про свою політику безпеки для SSL (наприклад, використання дійсного / недійсного сертифіката SSL?).
Брайан Клозел

Чи можете ви дати нам зразок коду, де ви можете відтворити помилку?
zaTricky

Відповіді:


302

Попередження: Не використовуйте це у виробничому коді!

Як вирішення, ви можете вимкнути перевірку сертифікату. Зробіть це лише колись, щоб отримати підтвердження того, що помилка викидається через поганий сертифікат.

Зателефонуйте цьому методу, перш ніж дзвонити smtpclient.Send():

    [Obsolete("Do not use this in Production code!!!",true)]
    static void NEVER_EAT_POISON_Disable_CertificateValidation()
    {
        // Disabling certificate validation can expose you to a man-in-the-middle attack
        // which may allow your encrypted message to be read by an attacker
        // https://stackoverflow.com/a/14907718/740639
        ServicePointManager.ServerCertificateValidationCallback =
            delegate (
                object s,
                X509Certificate certificate,
                X509Chain chain,
                SslPolicyErrors sslPolicyErrors
            ) {
                return true;
            };
    }

174
Це злом, а не виправлення?
Л.Б.

88
Хотілося б побачити виправлення, а не повністю вимкнути всю безпеку.
Роман Старков

71
як вирішення проблеми із безпекою ви можете вимкнути безпеку? WTF?
Джон Ніколас

68
Довелося спростувати це, оскільки люди все ще думають, що це рішення. Це ТІЛЬКИ ВКЛЮЧЕННЯ OFF SECURITY. НЕ ВИКОРИСТОВУЙТЕ У ВИРОБНИЦТВІ , люди. Він навіть так говорить. Шиш.
MGOwen

51
Оголошено. Я повністю погоджуюся, що це не повинно використовуватися у виробництві, АЛЕ я буду щось прообраз. Тестовий сервер, на який вони траплялися, надав мені можливість використовувати SSL. Робота з сертифікатами для мене досить нова, тому я просто хочу ШВИДКОГО ШЛЯХУ , що імхо чудово, оскільки я НЕ ВИКОРИСТУЮТЬ ЇЇ У ВИРОБНИЦТВІ
TweeZz

58

Посилання тут вирішило мою проблему.

http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html

Я перейшов до URL-сервісу веб-служби (на сервері, у якого виникла проблема), натиснув на маленьку піктограму безпеки в IE, яка підняла сертифікат. Потім я натиснув на вкладку "Деталі", натиснув кнопку "Копіювати у файл", що дозволило мені експортувати сертифікат як файл .cer. Отримавши сертифікат локально, я зміг імпортувати його в сховище сертифікатів на сервері, використовуючи наведені нижче інструкції.

Почніть новий MMC. Файл -> Додати / видалити оснащення ... Клацніть Додати ... Виберіть сертифікати та натисніть кнопку Додати. Перевірте перемикач "Обліковий запис комп'ютера". Клацніть Далі.

Виберіть клієнтський комп'ютер на наступному екрані. Клацніть Готово. Клацніть Закрити. Натисніть кнопку ОК. ЗАРАЗ встановіть сертифікат у сховище сертифікатів довірених кореневих сертифікатів. Це дозволить усім користувачам довіряти сертифікату.


+1 під час імпорту сертифіката через інструмент імпорту на cert, а не через оснащення, це стосується лише вашого облікового запису користувача. Використання оснащення дозволяє вибрати, для кого імпортувати, обліковий запис користувача, обліковий запис служби або всіх. Дякуємо за ваш покажчик Я там чесав голову хвилину-дві!
davidb

Якщо ви хочете використовувати командний рядок для автоматизації всіх робочих станцій dev / test - certutil -f -p test -importPFX Root devcert.pfxі certutil -f -p test -importPFX MY devcert.pfx. Потрібно запустити в командному рядку адміністратора (якщо припустити пароль PFX test)
DeepSpace101,

Це найкращий спосіб виправити це, якщо для тестування ви використовуєте самопідписаний сертифікат, завдяки T-Rex!
ToastyMallows

37

Ви можете вдосконалити код, запитавши користувача, коли сертифікат не дійсний, хоче він продовжувати чи ні. Ви хочете продовжити? Як нижче:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

І додайте такий спосіб:

public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;
    else
    {
        if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            return true;
        else
            return false;
    }
}

50
Хто натисне кнопку «Продовжити», якщо це хмарна програма?
Костянтин Ісаєв

34

Трохи запізнюємось на вечірку, але якщо ви шукаєте рішення на зразок Юрія, наступний код допоможе вам визначити, чи проблема пов’язана із сертифікатом самопідписання, а якщо так ігнорувати помилку самопідписання. Ви, очевидно, можете перевірити наявність інших помилок SSL, якщо цього хочете.

Код, який ми використовуємо (за допомогою Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ), такий:

  private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
  // If the certificate is a valid, signed certificate, return true.
  if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
  {
    return true;
  }

  // If there are errors in the certificate chain, look at each error to determine the cause.
  if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
  {
    if (chain != null && chain.ChainStatus != null)
    {
      foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
      {
        if ((certificate.Subject == certificate.Issuer) &&
           (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
        {
          // Self-signed certificates with an untrusted root are valid. 
          continue;
        }
        else
        {
          if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
          {
            // If there are any other errors in the certificate chain, the certificate is invalid,
         // so the method returns false.
            return false;
          }
        }
      }
    }

    // When processing reaches this line, the only errors in the certificate chain are 
// untrusted root errors for self-signed certificates. These certificates are valid
// for default Exchange server installations, so return true.
    return true;
  }
  else
  {
 // In all other cases, return false.
    return false;
  }
}

1
У моєму випадку sslPolicyErrors був RemoteCertificateNameMismatch, і я змінив перевірку сертифікатів, оскільки у нас не було однакових значень Subject і Issuer.
Ufuk Hacıoğulları

2
Сервер X509Certificate сервера Exchange постійно перемикався між самопідписаним та надійним. Використання цього коду допомогло моєму адміністратору мережі, і я не лише зрозумів, що це було так, але й вирішив проблему взагалі, лише обминувши сертифікати, що підписалися. Це було ідеально!
Брет

20

У мене була точно така ж проблема, і я з'ясував, що за замовчуванням у Mail Shield від Avast антивірусу було активовано "Scan SSL-з'єднання" . Обов’язково вимкніть це .

З моїх відомостей, Avast "відкриє" пошту, відсканує її на наявність вірусів, а потім підпише її за допомогою власного сертифіката, щоб повідомлення більше не підписувалося сертифікатом gmail, що призводить до помилки.

Рішення 1:

  • Вимкніть сканування SSL зі свого антивірусу (або всього поштового щита).

Рішення 2 (має бути найкращим мовою безпеки):

  • Отримати якось сертифікат, який використовується антивірусом (Avast має можливість експортувати його)
  • Імпортуйте його у клієнт Imap / pop / smtp перед тим, як підключитися до сервера gmail.

1
Ти врятував мені стільки часу. Взяв би назавжди, щоб зрозуміти, що винен мій антивірус, а не мій код.
arao6

13

Отримайте таку ж помилку під час надсилання з Outlook через ssl. Випробуваний параметр EnableSSL = помилка вирішила проблему.

приклад:

var smtp = new SmtpClient
                {
                    Host = "smtp.gmail.com",                   
                    Port = 587,
                    EnableSsl = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    UseDefaultCredentials = false,                   
                    Credentials = new NetworkCredential("xxx@gmail.com", "xxxxx")
                };

3
gmail не дозволить вам підключитися, поки ви встановили SSL на значення false, я спробував ваше рішення, воно не працювало для мене.
Зеешан Аджал

Так, це те, що я називаю "basic" (проти "none" або "ssl") ....... ці налаштування електронної пошти іноді складні.
granadaCoder

9

Ви впевнені, що використовуєте правильну адресу SMTP-сервера?

І smtp.google.com, і smtp.gmail.com працюють, але сертифікат SSL видається другому.


9

У мене була така ж помилка, коли я намагався надсилати електронну пошту за допомогою SmtpClient допомогою проксі-сервера (Usergate).

Перевіряє сертифікат, що містить адресу сервера, яка не дорівнює адресі проксі-сервера, отже, помилка. Моє рішення: коли під час перевірки сертифіката виникає помилка, отримайте сертифікат, експортуйте його та перевірте.

public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        // if got an cert auth error
        if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
        const string sertFileName = "smpthost.cer";

        // check if cert file exists
        if (File.Exists(sertFileName))
        {
            var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
            return certificate.Equals(actualCertificate);
        }

        // export and check if cert not exists
        using (var file = File.Create(sertFileName))
        {
            var cert = certificate.Export(X509ContentType.Cert);
            file.Write(cert, 0, cert.Length);
        }
        var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(createdCertificate);
    }

Повний код мого класу відправника електронної пошти:

public class EmailSender
{
    private readonly SmtpClient _smtpServer;
    private readonly MailAddress _fromAddress;

    public EmailSender()
    {
        ServicePointManager.ServerCertificateValidationCallback = RemoteServerCertificateValidationCallback;
        _smtpServer = new SmtpClient();
    }

    public EmailSender(string smtpHost, int smtpPort, bool enableSsl, string userName, string password, string fromEmail, string fromName) : this()
    {
        _smtpServer.Host = smtpHost;
        _smtpServer.Port = smtpPort;
        _smtpServer.UseDefaultCredentials = false;
        _smtpServer.EnableSsl = enableSsl;
        _smtpServer.Credentials = new NetworkCredential(userName, password);

        _fromAddress = new MailAddress(fromEmail, fromName);
    }

    public bool Send(string address, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        return Send(new List<MailAddress> { new MailAddress(address) }, mailSubject, htmlMessageBody, fileName);
    }

    public bool Send(List<MailAddress> addressList, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        var mailMessage = new MailMessage();
        try
        {
            if (_fromAddress != null)
                mailMessage.From = _fromAddress;

            foreach (var addr in addressList)
                mailMessage.To.Add(addr);

            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Subject = mailSubject;

            mailMessage.Body = htmlMessageBody;
            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.IsBodyHtml = true;

            if ((fileName != null) && (System.IO.File.Exists(fileName)))
            {
                var attach = new Attachment(fileName, MediaTypeNames.Application.Octet);
                attach.ContentDisposition.CreationDate = System.IO.File.GetCreationTime(fileName);
                attach.ContentDisposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
                attach.ContentDisposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
                mailMessage.Attachments.Add(attach);
            }
            _smtpServer.Send(mailMessage);
        }
        catch (Exception e)
        {
            // TODO lor error
            return false;
        }
        return true;
    }

    public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    // if got an cert auth error
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
    const string sertFileName = "smpthost.cer";

    // check if cert file exists
    if (File.Exists(sertFileName))
    {
        var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(actualCertificate);
    }

    // export and check if cert not exists
    using (var file = File.Create(sertFileName))
    {
        var cert = certificate.Export(X509ContentType.Cert);
        file.Write(cert, 0, cert.Length);
    }
    var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
    return certificate.Equals(createdCertificate);
}

}


7

Я знаю, що я запізнююся в цій грі, але я не бачив відповіді, яка вказувала б на журнали system.diagnostics для потоку TLS.

Перш ніж внести будь-які зміни у свій код, переконайтеся, що ви розумієте, у чому проблема. Це AuthenticationExceptionодин із тих загальних винятків, які не дуже багато розповідають. Щоб дізнатися, що відбувається під кришкою, відредагуйте файл app.config для вашої програми (або створіть новий) та переконайтеся, що у розділі включено джерело слідів System.Netsystem.diagnostics , наприклад:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" />
    <sharedListeners>
      <add name="file" initializeData="c:\network.log" type="System.Diagnostics.TextWriterTraceListener" />
    </sharedListeners>
    <sources>
      <source name="System.Net" switchValue="Verbose">
        <listeners>
          <add name="file" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Перезапустіть програму та перевірте файл c: \ network.log. Ви можете побачити там детальну інформацію про ваше TLS (SSL) з'єднання, наприклад:

System.Net Information: 0 : [12764] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = f44368:535f958, targetName = localhost, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [12764] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [12764] Remote certificate: [Version]
  V3

[Subject]
  CN=test
  Simple Name: test
  DNS Name: example.com

[Issuer]
  CN=Root CA
  Simple Name: Root CA
  DNS Name: Root CA

...

[Signature Algorithm]
  sha256RSA(1.2.840.113549.1.1.11)

[Public Key]
  Algorithm: RSA
  Length: 2048
  Key Blob: ....
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate has errors:
System.Net Information: 0 : [12764] SecureChannel#38496415 -    Certificate name mismatch.
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate was verified as invalid by the user.
System.Net Error: 0 : [12764] Exception in AppDomain#10923418::UnhandledExceptionHandler - The remote certificate is invalid according to the validation procedure..

Знаючи, що викликає проблему, ви повинні мати можливість вирішити її або принаймні звузити пошукові запити Google.


6

Під час виклику AuthenticateAsClient моя проблема була на Windows 2003 Server. Розчини вище (наприклад, обхідServicePointManager.ServerCertificateValidationCallback ) не спрацювали.

Виявляється, це помилка в Windows 2003, і ​​є виправлення:

"Програми, які використовують API криптографії, не можуть перевірити сертифікат X.509 в Windows Server 2003"

https://support.microsoft.com/en-us/kb/938397

Встановлення цього виправлення вирішило мою проблему.


4

Папка вашого веб-сайту потребує захисту послуг мережі. Особливо web.config. Він використовує цей обліковий запис для доступу до вашого реєстру для отримання сертифікатів. Це зупинить необхідність додавати хак у свій код.


4

Моя проблема полягала не в тому, що я посилався на сервер IP-адресою, а не URL-адресою. Я придбав підписаний сертифікат у ЦА для використання всередині приватної мережі. URL-адреса, вказана в сертифікаті, має значення при посиланні на сервер. Як тільки я посилав сервер за URL-адресою в сертифікаті, все почало працювати.


Ця відповідь заслуговує на верхню, оскільки вона вказує на поширену помилку; люди (в тому числі і я) вважають, що мета Хоста - лише знайти сервер.
Мойтаба

4

Перевірте дату та час свого комп’ютера. Якщо він неправильний, оновіть його до поточного часу або встановіть його автоматично, щоб отримати час з Інтернету.

Оскільки сертифікати прив’язані до фіксованого періоду часу, якщо ваш годинник неправильний, ви, ймовірно, отримаєте подібні помилки. У такому сценарії, визначаючи час, проблема буде виправлена.


1
Якщо системна дата "занадто далека" від поточного часу, дійсність сертифіката, отриманого від google, викликає проблему. Він бачить видану та дійсну інформацію, яка не займає багато поточного часу. Це не єдине, що не може викликати це питання. Але це, безумовно, те, що може.
phil soady

1
Надзвичайно корисне нагадування про те, щоб двічі перевірити це в моєму випадку! Бритва Оккама та все таке ... :) Тепер про цю батарею CMOS ...
Майк G


2

У нашому випадку проблема була викликана сертифікатом сервера IIS. Тема сертифіката була встановлена ​​на ім'я DNS, і користувачі намагалися отримати доступ до веб-сайту за допомогою IP-адреси, тому перевірка сертифікації .NET не вдалася. Проблема зникла, коли користувачі почали використовувати ім’я DNS.

Тому вам потрібно змінити URL-адресу постачальника на https: //CertificateSubject/xxx/xxx.application


Чи можете ви це детальніше розробити? У моєму випадку додаток працює на одному сервері, а на іншому не працює. Я незрозумілий ... Я не фахівець, але домен все ще підключений до робочого, а сертифікат сервера вже встановлений на обох машинах. Досі не розумію, чому це може бути якось актуальним, оскільки там написано "віддалений сертифікат".
Майкл Бреннт


1

Додавання цього рядка працювало для мене. Це насправді довіряє всім сертифікатам, як згадувалося тут . Однак це може використовуватися насамперед для усунення несправностей. Якщо це працює для вас, то це означає, що сертифікат віддаленого сервера не додається як надійний сертифікат у вашій машині.

System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);

Повний код є

private void sendAMail(String toAddress, String messageBody)
        {
            String msg = "Sending mail to : " + toAddress;

            MailMessage mail = new MailMessage();
            mail.To.Add(toAddress);
            mail.From = new MailAddress("from@mydomain.com");
            mail.Subject = "Subject: Test Mail";
            mail.Body = messageBody;
            mail.IsBodyHtml = true;            

            //Added this line here
            System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
            SmtpClient smtp = new SmtpClient();

            smtp.Host = "myhostname.com";            
            smtp.Credentials = new System.Net.NetworkCredential("sender@sample.com", "");
            smtp.EnableSsl = true;
            smtp.Port = 587;            
            smtp.Send(mail);            
        }


private bool RemoteServerCertificateValidationCallback(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    //Console.WriteLine(certificate);
    return true;
}

0

Це вирішило моє питання

smtpClient.Credentials = new NetworkCredential(sendMail.UserName, sendMail.Password);
smtpClient.EnableSsl = false;//sendMail.EnableSSL;

// З посиланням на // Проблема приходить лише Використовуйте вищевказаний рядок, щоб встановити помилковий SSl для вирішення помилок, коли в налаштуваннях SMTP введено ім’я користувача та пароль.


13
Це також вимикає безпеку.
Зої

0

ось рішення, яке я вирішив використати.

        ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            string name = certificate.Subject;

            DateTime expirationDate = DateTime.Parse(certificate.GetExpirationDateString());

            if (sslPolicyErrors == SslPolicyErrors.None || (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch && name.EndsWith(".acceptabledomain.com") && expirationDate > DateTime.Now))
            {
                return true;
            }
            return false;
        };

0

Код із прийнятої відповіді допоміг мені налагодити проблему. Тоді я зрозумів, що поле certificateаргументу SN не те саме, що я вважав моїм SMTP-сервером. Встановивши Hostвластивість екземпляра SmtpClient на значення SN сертифіката, я зміг виправити проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.