“El certificado remoto no es válido de acuerdo con el procedimiento de validación” mediante el servidor SMTP de Gmail

Me aparece este error:

El certificado remoto no es válido de acuerdo con el procedimiento de validación.

cada vez que bash enviar un correo electrónico usando el servidor SMTP de Gmail en mi código C #. ¿Puede alguien señalarme la dirección correcta para encontrar una solución a este problema?

El siguiente es el seguimiento de la stack …

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) 

Advertencia: ¡No use esto en el código de producción!

Como solución alternativa, puede desactivar la validación del certificado.
Coloque este código en algún lugar antes de smtpclient.Send() :

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

El enlace aquí resolvió mi problema.

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

Fui a la url del servicio web (en el servidor que tenía el problema), hice clic en el pequeño icono de seguridad en IE, que sacó el certificado. Luego hice clic en la pestaña Detalles, hice clic en el botón Copiar a archivo, lo que me permitió exportar el certificado como un archivo .cer. Una vez que obtuve el certificado localmente, pude importarlo en el almacén de certificados en el servidor usando las instrucciones a continuación.

Comience una nueva MMC. Archivo -> Agregar / Eliminar complemento … Haga clic en Agregar … Elija Certificados y haga clic en Agregar. Verifique el botón de radio “Cuenta de computadora”. Haga clic en Siguiente.

Elija la computadora cliente en la pantalla siguiente. Haga clic en Finalizar. Haga clic en Cerrar. Haga clic en Aceptar. AHORA instale el certificado en el almacén de certificados de Entidades de certificación raíz de confianza. Esto permitirá que todos los usuarios confíen en el certificado.

Puede mejorar el código para preguntar al usuario que el certificado no es válido. ¿Quieres continuar? Como a continuación:

 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); 

Y agrega un método como este:

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

Un poco tarde para la fiesta, pero si está buscando una solución como la de Yury, el siguiente código lo ayudará a identificar si el problema está relacionado con un certificado de auto-firma y, de ser así, ignore el error de auto-firma. Obviamente, podría verificar otros errores SSL si así lo desea.

El código que usamos (cortesía de Microsoft – http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) es el siguiente:

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

Tuve exactamente el mismo problema y me di cuenta de que, por defecto, el antivirus de Mail Shield de Avast tenía activada la “conexión Scan SSL” . Asegúrate de apagarlo .

Por lo que sé, Avast “abrirá” el correo, lo escaneará en busca de virus y luego lo firmará con su propio certificado para que el correo ya no esté firmado por el certificado de gmail, lo que produce ese error.

Solución 1:

  • Desactive las exploraciones SSL de su antivirus (o la protección completa del correo).

Solución 2 (debería ser la mejor forma de hablar de seguridad):

  • Obtener de alguna manera el certificado utilizado por el antivirus (Avast tiene una opción para exportarlo)
  • Importe en su cliente imap / pop / smtp antes de conectarse al servidor de gmail.

¿Estás seguro de que estás usando la dirección correcta del servidor SMTP?

Tanto smtp.google.com como smtp.gmail.com funcionan, pero el certificado SSL se emite para el segundo.

Obtiene el mismo error al enviar desde outlook debido a ssl. La configuración probada EnableSSL = false resolvió el problema.

ejemplo:

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

Tuve el mismo error cuando intenté enviar un correo electrónico usando SmtpClient través del servidor proxy (Usergate).

Verifica que el certificado contenga la dirección del servidor, que no es igual a la dirección del servidor proxy, de ahí el error. Mi solución: cuando se produce un error al verificar el certificado, recibe el certificado, expórtalo y verifica.

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

Código completo de mi clase de remitente de correo electrónico:

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

}

Mi problema estaba en Windows 2003 Server, al llamar a AuthenticateAsClient. Las soluciones anteriores (por ejemplo, eludir ServicePointManager.ServerCertificateValidationCallback ) no funcionaron.

Resulta que esto es un error en Windows 2003, y hay una revisión:

“Las aplicaciones que utilizan la API de criptografía no pueden validar un certificado X.509 en Windows Server 2003”

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

La instalación de esta revisión resolvió mi problema.

La carpeta de su sitio web necesita seguridad del servicio de red. Especialmente la web.config. Utiliza esta cuenta para acceder a su registro para los certificados. Esto detendrá la necesidad de agregar un truco a su código.

Verifique la fecha y hora de su computadora. Si es incorrecto, actualícelo a la hora actual o configúrelo automáticamente para obtener el tiempo de Internet.

Debido a que los certificados están vinculados a un período de tiempo fijo, si su reloj está equivocado, es probable que obtenga errores como este. En ese escenario, al fijar el tiempo, el problema se solucionará.

Mi problema no era que estaba haciendo referencia al servidor por la dirección IP en lugar de la URL. Compré un certificado firmado de una CA para usar dentro de una red privada. La URL especificada en el certificado importa cuando se hace referencia al servidor. Una vez que hice referencia al servidor por la URL en el certificado, todo comenzó a funcionar.

Para aquellos que encuentran este mismo error al conectarse a un sitio local con un certificado autofirmado, la siguiente publicación de blog me ayudó.

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

En nuestro caso, el problema fue causado por el certificado del servidor IIS. El sujeto del certificado se configuró con el nombre DNS y los usuarios intentaban acceder al sitio web por dirección IP, por lo que la validación de la certificación .NET falló. El problema desapareció cuando los usuarios comenzaron a usar el nombre DNS.

Por lo tanto, debe cambiar su URL de proveedor a https: //CertificateSubject/xxx/xxx.application

Hay un artículo de blog de MSDN sobre la investigación de este tipo de problemas:

Solución de problemas de ASP.NET: el certificado remoto no es válido según el procedimiento de validación:
http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate-is-invalid-according-to-the-validation-procedure.aspx

Solucionó mi problema

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

// Con referencia a // El problema viene solo Use la línea superior para establecer SSl falso para resolver el error cuando se ingresa el nombre de usuario y la contraseña en la configuración SMTP.

aquí está la solución que decidí usar.

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