"El certificado remoto no es válido de acuerdo con el procedimiento de validación". utilizando el servidor SMTP de Gmail

222

Recibo este error:

El certificado remoto no es válido según el procedimiento de validación.

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

El siguiente es el seguimiento de la pila ...

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)
Josh
fuente
1
¿Puede contarnos más sobre su configuración para usar servidores SMTP de Gmail? Mi conjetura: ¿Puede contarnos más sobre sus políticas de seguridad para SSL (como usar un certificado SSL válido / no válido)?
Brian Clozel
¿Puede darnos una muestra de código donde pueda reproducir el error?
zaTricky

Respuestas:

302

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

Como solución alternativa, puede desactivar la validación de certificados. Solo haga esto para obtener la confirmación de que el error se está lanzando debido a un certificado incorrecto.

Llame a este método antes de llamar 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;
            };
    }
Yury Skaletskiy
fuente
175
Este es un truco, no una solución?
LB.
88
Me encantaría ver una solución, en lugar de desactivar toda la seguridad por completo.
Roman Starkov
71
Como solución a un problema de seguridad, ¿puede desactivar la seguridad? WTF?
John Nicholas
68
Tuve que rechazar esto, ya que la gente todavía parece pensar que es una solución. Está APAGANDO LA SEGURIDAD. NO UTILIZAR EN PRODUCCIÓN , personas. Incluso lo dice. Sheesh
MGOwen
51
Votado Estoy totalmente de acuerdo en que esto no debería usarse en la producción PERO ... Estoy haciendo un prototipo de algo. El servidor de prueba que me proporcionaron me obliga a usar SSL. Trabajar con certificados es bastante nuevo para mí, así que solo quiero un CAMINO RÁPIDO , lo cual está bien, ya que NO LO UTILIZARÉ EN LA PRODUCCIÓN
TweeZz
58

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 ícono de seguridad en IE, que trajo 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 tuve el certificado localmente, pude importarlo al 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. Marque el botón de radio "Cuenta de computadora". Haga clic en Siguiente.

Elija la computadora cliente en la siguiente pantalla. Haz clic en Finalizar. Haga clic en Cerrar Haga clic en Aceptar. AHORA instale el certificado en el almacén de certificados de Trusted Root Certification Authority. Esto permitirá que todos los usuarios confíen en el certificado.

Tirano saurio Rex
fuente
+1 al importar un certificado a través de la herramienta de importación en el certificado y no a través del complemento, es solo para su cuenta de usuario. El uso del complemento le permite elegir para quién es la importación, cuenta de usuario, cuenta de servicio o todos. Gracias por tu puntero. ¡Me rasqué la cabeza por un minuto o dos allí!
davidb
Si desea utilizar la línea de comandos para automatizar todas las estaciones de trabajo de desarrollo / prueba, certutil -f -p test -importPFX Root devcert.pfxy certutil -f -p test -importPFX MY devcert.pfx. Debe ejecutarse en un símbolo del sistema de administración (suponiendo que la contraseña PFX sea test)
DeepSpace101
Esta es la mejor manera de solucionarlo si está utilizando un certificado autofirmado para las pruebas, ¡gracias T-Rex!
ToastyMallows
36

Puede mejorar el código preguntando al usuario cuándo el certificado no es válido si desea continuar o no. ¿Quieres continuar? Como a continuación:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Y agregue 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;
    }
}
LinuxLover
fuente
50
¿Quién hará clic en el botón "Continuar", si se trata de una aplicación en la nube?
Konstantin Isaev
34

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 firma propia y, si es así, ignore el error de firma propia. Obviamente, puede verificar si hay otros errores SSL si así lo desea.

El código que utilizamos (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;
  }
}
Hooligancat
fuente
1
Para mi caso, sslPolicyErrors era RemoteCertificateNameMismatch y modifiqué la verificación del certificado porque no teníamos los mismos valores de Asunto y Emisor.
Ufuk Hacıoğulları
2
El certificado X509 que utilizaba el servidor Exchange seguía cambiando entre uno autofirmado y uno de confianza. El uso de este código ayudó a mi administrador de red y a mí, no solo a descubrir que este era el caso, sino que también resolvió el problema al saltear los certificados autofirmados. ¡Esto fue perfecto!
Bret
20

Tuve exactamente el mismo problema y descubrí que por defecto el Mail Shield del antivirus Avast tenía activada la "Conexión de escaneo SSL" . Asegúrate de apagar eso .

Que yo sepa, Avast "abrirá" el correo, lo escaneará en busca de virus y luego lo firmará utilizando 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 los análisis SSL de su antivirus (o el escudo de correo completo).

Solución 2 (debería ser la mejor seguridad hablando):

  • Obtenga de alguna manera el certificado utilizado por el antivirus (Avast tiene una opción para exportarlo)
  • Importarlo en su cliente imap / pop / smtp antes de conectarse al servidor de gmail.
TehCivilian
fuente
1
Me salvaste mucho tiempo. Me hubiera llevado una eternidad descubrir que mi antivirus sería el culpable y no mi código.
arao6
13

Obtenga 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("[email protected]", "xxxxx")
                };
Chitra Pannirselvam
fuente
3
gmail no le permitirá conectarse mientras configura SSL en falso, probé su solución, no funcionó para mí.
Zeeshan Ajmal
Sí, esto es lo que yo llamo "básico" (frente a "ninguno" o "ssl") ... esas configuraciones de correo electrónico son difíciles a veces.
granadaCoder
9

¿Está seguro de que está utilizando 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.

Pawel Lesnikowski
fuente
9

Tuve el mismo error cuando intenté enviar un correo electrónico SmtpClientmediante un 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, recibir el certificado, exportarlo y verificar.

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

}

Evgeny Ivanov
fuente
7

Sé que llego bastante tarde en este juego, pero no he visto una respuesta aquí que apunte a los registros de system.diagnostics para TLS Stream.

Antes de hacer cualquier cambio en su código, asegúrese de entender de qué se trata el problema. El AuthenticationExceptiones uno de esa excepción muy genérico que no dice mucho. Para saber qué sucede debajo del capó, edite el archivo app.config para su aplicación (o cree uno nuevo) y asegúrese de tener habilitado el origen de rastreo System.Net en la system.diagnosticssección, por ejemplo:

<?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>

Vuelva a ejecutar su aplicación y verifique el archivo c: \ network.log. Debería ver información detallada sobre su conexión TLS (SSL), por ejemplo:

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..

Sabiendo qué causa el problema, debería poder resolverlo o al menos limitar sus búsquedas en Google.

diseño de bajo nivel
fuente
6

Mi problema fue en Windows 2003 Server, cuando llamé 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 usan 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.

usuario326608
fuente
4

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

Frans
fuente
4

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

Josh
fuente
Esta respuesta merece ser superior, porque señala un error común; la gente (incluido yo mismo) cree que el propósito de Host es solo encontrar el servidor.
Mojtaba
4

Verifique la fecha y hora de su computadora. Si está mal, actualícelo a la hora actual o configúrelo automáticamente para obtener la hora 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 arreglar el tiempo, el problema se solucionará.

AliSafari186
fuente
1
Si la fecha de su sistema está "demasiado lejos" de la hora actual, la validez del certificado recibido de Google causa un problema. Se ve emitido y válido para información que no tiene mucha hora actual. Esto no es lo único que no puede causar este problema. Pero ciertamente uno que puede.
Phil soady
1
¡Un recordatorio enormemente útil para verificar esto en mi caso! Navaja de Occam y todo eso ... :) Ahora sobre esa batería CMOS ...
Mike G
2

En nuestro caso, el problema fue causado por el certificado del servidor IIS. El sujeto del certificado se estableció en 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 la URL de su proveedor a https: //CertificateSubject/xxx/xxx.application

Ludwo
fuente
¿Puedes elaborar esto? En mi caso, la aplicación funciona en un servidor y no en el otro. No tengo ni idea ... No soy un experto, pero el dominio todavía está conectado al que funciona y el certificado del servidor ya está instalado en ambas máquinas. Todavía no entiendo por qué podría ser relevante de todos modos ya que dice "certificado remoto".
Michael Brennt
1

Agregar esta línea funcionó para mí. De hecho, esto confía en todos los certificados como se menciona aquí . Sin embargo, esto se puede usar principalmente para la resolución de problemas. Si esto funciona para usted, significa que el certificado del servidor remoto no se agrega como un certificado de confianza en su máquina.

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

El código completo es

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("[email protected]");
            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("[email protected]", "");
            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
fuente
0

Resolvió mi problema

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

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

usuario3584038
fuente
13
Esto también está desactivando la seguridad.
Zoey
0

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;
        };
El codificador perezoso
fuente
0

El código de la respuesta aceptada me ayudó a depurar el problema. Entonces me di cuenta de que el campo SN del certificateargumento no era el mismo que pensaba que era mi servidor SMTP. Al establecer la Hostpropiedad de la instancia SmtpClient en el valor SN del certificado, pude solucionar el problema.

ulu
fuente