it-swarm.dev

Obtención "El certificado remoto no es válido según el procedimiento de validación" cuando el servidor SMTP tiene un certificado válido

Esto parece un error común, pero si bien he encontrado una solución (vea a continuación) no puedo precisar la razón por la que lo estoy obteniendo en primer lugar.

Estoy escribiendo la funcionalidad SMTP en nuestra aplicación y estoy intentando agregar la funcionalidad SSL al SMTP en funcionamiento que ya tenemos.

Estoy probando con el servidor de MS Exchange de nuestra empresa y específicamente con la opción de correo web habilitada. Puedo enviar correos electrónicos internamente a través de mi código al no autenticar mi conexión y enviarlos de forma anónima, sin embargo, esos correos electrónicos no se transmitirán a direcciones de correo electrónico externas debido a la política de nuestra compañía. Además, estoy programando esto para nuestros clientes y no todos permiten conexiones de retransmisión y/o anónimas abiertas.

Creo que el servidor de Exchange está utilizando SSL/TLS explícito. He intentado telnet a la dirección del servidor en el puerto 25 y obtuve una respuesta de texto, una respuesta legible por humanos, que de acuerdo con algunas de mis búsquedas anteriores significa que está utilizando Explicit SSL/TLS.

Tengo el siguiente código de prueba

SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);

Durante mi búsqueda de una solución encontré esto "El certificado remoto no es válido de acuerdo con el procedimiento de validación". utilizando el servidor SMTP de Gmail

De donde obtuve el siguiente código ...

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

Esto funciona en mi código de prueba. SIN EMBARGO, el proceso real que estoy escribiendo (en lugar de mi código de prueba) se ejecutará en segundo plano y realmente no se puede preguntar al usuario (en su lugar, informa errores en el registro de errores de Windows).

Cuando comencé, mi pregunta es realmente por qué recibo este error. Si voy a https: webmail.ourdomain.co.uk en un navegador, muestra un certificado válido y no hay ninguna opción para instalar el certificado (como lo hubiera hecho si fuera uno con firma automática).

Certificate Screenshot Sin embargo, cuando ejecuto mi código, con un punto de interrupción de la depuración en el método ValidateServerCertificate, miro los valores del certificado y veo un emisor de nuestro servidor local y "no usar antes" y "no usar después" de las propiedades de hoy. Esto no coincide con el certificado que estoy recibiendo.

También he comprobado cuáles son los indicadores sslPolicyErrors en la depuración de ValidateServerCertificate, y muestran "RemoteCertificateChainErrors" y "RemoteCertificateNameMismatch".

Entonces, ¿qué es lo que me falta de esto ... por qué no está utilizando el certificado correcto? Si hay pasos que debo seguir para instalar el certificado localmente para su uso, entonces necesito conocerlos para poder decirles a mis clientes qué deben hacer si obtienen esto.

No quiero simplemente pasar por alto el cheque devolviendo verdadero desde el método ValidateServerCertificate, y debido a que es un proceso en segundo plano, no puedo preguntarle al usuario, así que necesito entender cómo hacer que mi código use el código correcto/confiable. certificado.

Espero que alguien pueda aconsejar.

15
RosieC

La respuesta que finalmente encontré es que el servicio SMTP en el servidor no está utilizando el mismo certificado que https.

Los pasos de diagnóstico que había leído aquí supongo que usan el mismo certificado y cada vez que lo he intentado en el pasado lo han hecho y los pasos de diagnóstico son exactamente lo que he hecho para resolver el problema. varias veces.

En este caso, esos pasos no funcionaron porque los certificados en uso eran diferentes, y la posibilidad de esto es algo que nunca había encontrado.

La solución es exportar el certificado real del servidor y luego instalarlo como un certificado de confianza en mi máquina, u obtener un certificado de confianza/válido diferente para el servicio SMTP en el servidor. Eso es actualmente con nuestro departamento de TI que administra los servidores para decidir qué es lo que quieren hacer.

7
RosieC

Publicación anterior, pero como usted dijo "por qué no está usando el certificado correcto", me gustaría ofrecer una forma de averiguar qué certificado SSL se usa para SMTP (vea aquí ) que requiere openssl:

openssl s_client -connect exchange01.int.contoso.com:25 -starttls smtp

Esto describirá el certificado SSL utilizado para el servicio SMTP. Según lo que vea aquí, puede reemplazar el certificado incorrecto (como ya hizo) con uno correcto (o confiar en el certificado manualmente).

2
BastianW

Publicación anterior, pero pensé que compartiría mi solución porque no hay muchas soluciones para este problema.

Si está ejecutando una máquina vieja con Windows Server 2003, es probable que necesite instalar una revisión (KB938397).

Este problema se produce porque la API de criptografía 2 (CAPI2) en Windows Server 2003 no es compatible con la familia SHA2 de algoritmos de hashing. CAPI2 es la parte de la API de criptografía que maneja los certificados.

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

Por el motivo que sea, Microsoft quiere enviarle este hotfix por correo electrónico en lugar de permitirle descargarlo directamente. Aquí hay un enlace directo a la revisión del correo electrónico:

http://hotfixv4.Microsoft.com/Windows Server 2003/sp3/Fix200653/3790/free/315159_ENU_x64_Zip.exe

0
user1003916