«Удаленный сертификат недействителен в соответствии с процедурой проверки». используя SMTP-сервер Gmail

222

Я получаю эту ошибку:

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

всякий раз, когда я пытаюсь отправить электронную почту, используя 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;
            };
    }
Юрий Скалецкий
источник
175
Это взломать, а не исправить?
LB.
88
Хотелось бы увидеть исправление, а не отключать всю безопасность полностью.
Роман Старков
71
В качестве обходного пути к проблеме безопасности вы можете отключить безопасность? WTF?
Джон Николас
68
Пришлось преуменьшить это, поскольку люди все еще думают, что это решение. Это ТОЛЬКО ВКЛЮЧЕНИЕ OFF SECURITY. НЕ ИСПОЛЬЗУЙТЕ В ПРОИЗВОДСТВЕ , люди. Он даже так говорит. Sheesh.
MGOwen
51
Upvoted. Я полностью согласен, что это не должно использоваться в производстве, НО .. Я делаю прототип чего-то. Тестовый сервер, который они предоставили мне, заставляет меня использовать SSL. Работа с сертификатами является для меня довольно новой, поэтому я просто хочу БЫСТРЫЙ ПУТЬ , что имхо хорошо, так как я НЕ ИСПОЛЬЗУЮ ЕГО В ПРОИЗВОДСТВЕ
TweeZz
58

Ссылка здесь решила мою проблему.

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

Я перешел по URL веб-службы (на сервере, на котором возникла проблема), щелкнул по маленькому значку безопасности в IE, который вызвал сертификат. Затем я нажал на вкладку «Подробности», нажал кнопку «Копировать в файл», что позволило мне экспортировать сертификат в виде файла .cer. Получив сертификат локально, я смог импортировать его в хранилище сертификатов на сервере, используя приведенные ниже инструкции.

Начать новую MMC. Файл -> Добавить / Удалить оснастку ... Нажмите Добавить ... Выберите Сертификаты и нажмите Добавить. Проверьте переключатель «Учетная запись компьютера». Нажмите кнопку "Далее.

Выберите клиентский компьютер на следующем экране. Нажмите Готово. Нажмите Закрыть. Нажмите ОК. СЕЙЧАС установите сертификат в хранилище сертификатов доверенных корневых центров сертификации. Это позволит всем пользователям доверять сертификату.

T-Rex
источник
+1 при импорте сертификата через инструмент импорта в сертификат, а не через оснастку, это только для вашей учетной записи пользователя. Использование оснастки позволяет выбрать, для кого предназначен импорт: учетную запись пользователя, служебную учетную запись или всех остальных. Спасибо за указатель. Я почесал свою голову на минуту или две!
Давидб
Если вы хотите использовать командную строку для автоматизации всех рабочих станций dev / test - certutil -f -p test -importPFX Root devcert.pfxи certutil -f -p test -importPFX MY devcert.pfx. Необходимо запустить в командной строке администратора (при условии, что пароль PFX - test)
DeepSpace101
Это лучший способ исправить это, если вы используете самозаверяющий сертификат для тестирования, спасибо T-Rex!
ToastyMallows
36

Вы можете улучшить код, спросив пользователя, когда сертификат недействителен, хочет ли он продолжить или нет. Вы хотите продолжить? Как показано ниже:

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;
    }
}
LinuxLover
источник
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;
  }
}
Hooligancat
источник
1
В моем случае sslPolicyErrors был RemoteCertificateNameMismatch, и я изменил проверку сертификата, потому что у нас не было одинаковых значений Subject и Issuer.
Ufuk Hacıoğulları
2
Сертификат X509, используемый сервером Exchange, постоянно переключался между самоподписанным и доверенным. Использование этого кода помогло моему сетевому администратору и мне не только понять, что это так, но и полностью решить проблему, обходя только самозаверяющие сертификаты. Это было прекрасно!
Брет
20

У меня была точно такая же проблема, и я понял, что по умолчанию на антивирусе Mail Shield от Avast активировано «Сканировать SSL-соединение» . Убедитесь, что выключили это .

Насколько мне известно, Avast "откроет" почту, проверит ее на наличие вирусов и затем подпишет ее, используя собственный сертификат, чтобы почта больше не была подписана сертификатом gmail, который вызывает эту ошибку.

Решение 1:

  • Отключите сканирование SSL с вашего антивируса (или всего почтового щита).

Решение 2 (Должно быть, если говорить о безопасности лучше):

  • Получить как-нибудь сертификат, используемый антивирусом (у Avast есть возможность его экспортировать)
  • Импортируйте его в свой клиент imap / pop / smtp перед подключением к серверу gmail.
tehCivilian
источник
1
Вы сэкономили мне так много времени. Потребовалось бы целую вечность, чтобы понять, что виноват мой антивирус, а не мой код.
arao6
13

Получите ту же ошибку при отправке из outlook из-за ssl. Пробная установка EnableSSL = false решила проблему.

пример:

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, я попробовал ваше решение, оно не сработало для меня.
Зеешан Аджмал,
Да, это то, что я называю "базовым" (против "нет" или "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 Stream.

Прежде чем вносить какие-либо изменения в свой код, убедитесь, что понимаете, в чем проблема. Это 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.

lowleveldesign
источник
6

Моя проблема была на Windows 2003 Server при вызове AuthenticateAsClient. Указанные выше решения (например, обход ServicePointManager.ServerCertificateValidationCallback) не сработали.

Оказывается, это ошибка в Windows 2003, и есть исправление:

«Приложения, использующие API-интерфейс шифрования, не могут проверить сертификат X.509 в Windows Server 2003»

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

Установка этого исправления решила мою проблему.

user326608
источник
5

Моя проблема была не в том, что я ссылался на сервер по IP-адресу, а не по URL-адресу. Я купил подписанный сертификат в ЦС для использования в частной сети. URL, указанный в сертификате, имеет значение при обращении к серверу. Как только я ссылался на сервер по URL в сертификате, все начало работать.

мистифицировать
источник
Этот ответ заслуживает того, чтобы быть выше, потому что он указывает на распространенную ошибку; люди (в том числе и я) думают, что целью хоста является только поиск сервера.
Мойтаба
4

Папка вашего сайта нуждается в безопасности сетевой службы. Особенно web.config. Он использует эту учетную запись для доступа к вашему реестру для сертификатов. Это избавит от необходимости добавлять хак в ваш код.

Frans
источник
4

Проверьте дату и время вашего компьютера. Если это не так, обновите его до текущего времени или установите его автоматически, чтобы получить время из Интернета.

Поскольку сертификаты привязаны к фиксированному периоду времени, если ваши часы неверны, вы, скорее всего, получите такие ошибки. В этом случае, установив время, проблема будет решена.

AliSafari186
источник
1
Если ваша системная дата «слишком далека» от текущего времени, срок действия сертификата, полученного от Google, вызывает проблему. Он видит выданный и действительный для информации, которая не очень много текущего времени. Это не единственное, что не может вызвать эту проблему. Но это, безусловно, тот, который может.
Фил Соеди
1
Чрезвычайно полезное напоминание, чтобы дважды проверить это в моем случае! Бритва Оккама и все такое ... :) Теперь об этой батарее CMOS ...
Майк Г
2

В нашем случае проблема была вызвана сертификатом сервера IIS. В качестве темы сертификата было указано имя DNS, и пользователи пытались получить доступ к веб-сайту по IP-адресу, поэтому проверка сертификата .NET не удалась. Проблема исчезла, когда пользователи начали использовать DNS-имя.

Поэтому вы должны изменить URL своего провайдера на https: //CertificateSubject/xxx/xxx.application

Ludwo
источник
Вы можете это уточнить? В моем случае приложение работает на одном сервере и не работает на другом. Я не в курсе ... Я не эксперт, но домен все еще подключен к рабочему, и сертификат сервера уже установлен на обеих машинах. До сих пор не понимаю, почему это может быть так или иначе актуально, поскольку в нем говорится «удаленный сертификат».
Майкл Брент
2

В блоге MSDN есть статья о расследовании подобных проблем:

Устранение неполадок ASP.NET - удаленный сертификат является недействительным в соответствии с процедурой проверки: http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/trou устранение неполадок-asp-net-the-remote-certificate-
является-инвалидом-по-до-проверка-procedure.aspx

Дэвид Бург
источник
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;
}
Erdnase
источник
0

Это решило мою проблему

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

// Со ссылкой на // Проблема приходит только Используйте строку выше, чтобы установить false SSl для устранения ошибки, когда имя пользователя и пароль введены в настройках SMTP.

user3584038
источник
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

Код из принятого ответа помог мне отладить проблему. Затем я понял, что поле SN certificateаргумента не совпадает с тем, что я думал, был мой SMTP-сервер. Установив для Hostсвойства экземпляра SmtpClient значение SN сертификата, я смог решить эту проблему.

улу
источник