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

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

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

когда я пытаюсь отправить электронную почту с помощью 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) 

Предупреждение: не используйте это в производственном коде!

В качестве обходного пути вы можете отключить проверку сертификата.
Поместите этот код где-нибудь перед smtpclient.Send() :

 ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 

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

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

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

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

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

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

 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; } } 

Немного поздно на вечеринку, но если вы ищете решение, подобное Юрию, следующий код поможет вам определить, связана ли проблема с сертификатом самооценки и, если это так игнорировать ошибку самооценки. Очевидно, вы могли бы проверить другие ошибки 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; } } 

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

Насколько мне известно, Avast «откроет» почту, сканирует ее на наличие каких-либо вирусов и затем подписывает ее с помощью собственного сертификата, чтобы почта больше не была подписана сертификатом gmail, который вызывает эту ошибку.

Решение 1:

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

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

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

Вы уверены, что используете правильный адрес SMTP-сервера?

Работают как smtp.google.com, так и smtp.gmail.com, но сертификат SSL выдается на второй.

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

пример:

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

У меня была такая же ошибка, когда я пытался отправить электронное письмо с помощью 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 { new MailAddress(address) }, mailSubject, htmlMessageBody, fileName); } public bool Send(List 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); } 

}

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

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

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

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

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

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

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

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

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

Для тех, кто сталкивается с этой же ошибкой при подключении к локальному сайту с самозаверяющим сертификатом, мне помог следующий пост в блоге.

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

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

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

Существует статья блога MSDN по исследованию этого типа проблем:

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

Он решил мою проблему

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

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

вот решение, которое я решил использовать.

  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; }; 
  • Какова разница в поведении между обратным путем, ответом и от?
  • Как разработать и протестировать приложение, отправляющее электронные письма (без заполнения чей-то почтового ящика с тестовыми данными)?
  • Отправить электронную почту через C # через аккаунт Google Apps
  • Принтер не может использовать SMTP-сервер Gmail
  • Как найти компьютер в моей сети, который занимается массовыми рассылками?
  • Отправка электронной почты через gmail SMTP на GoDaddy
  • Mail multipart / alternative vs multipart / mixed
  • В любом случае, чтобы создать SMTP-сервер в Windows 7?
  • Отправка почты без установки SMTP-сервера
  • Gmail SMTP debug: ошибка «войдите в свой веб-браузер»
  • Как отправить электронное письмо с помощью C # через Gmail
  • Давайте будем гением компьютера.