web-dev-qa-db-fra.com

Obtention de "Le certificat distant est invalide conformément à la procédure de validation" lorsque le serveur SMTP a un certificat valide

Cela semble être une erreur courante, mais bien que j’ai trouvé un moyen de contourner le problème (voir ci-dessous), je ne parviens pas à déterminer la raison pour laquelle je l’ai reçue.

J'écris la fonctionnalité SMTP dans notre application et j'essaie d'ajouter une fonctionnalité SSL au SMTP fonctionnel que nous avons déjà.

Je teste en utilisant le serveur MS Exchange de notre société et en particulier l'option de messagerie Web activée sur celui-ci. Je peux envoyer des e-mails en interne via mon code en ne authentifiant pas ma connexion et en envoyant de manière anonyme. Cependant, ces e-mails ne seront pas retransmis à des adresses e-mail externes en raison de la politique de notre société. En plus de cela, je le programme pour nos clients et ils ne permettent pas tous des connexions à relais ouvert et/ou anonyme.

Je crois que le serveur Exchange utilise Explicit SSL/TLS. J'ai essayé telnet à l'adresse du serveur sur le port 25 et obtenu une réponse textuelle, une réponse lisible par l'homme, qui selon certaines de mes recherches signifie auparavant qu'il utilise Explicit SSL/TLS.

J'ai le code de test suivant

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

Au cours de ma recherche d'une solution, je suis tombé sur ceci "Le certificat distant est invalide selon la procédure de validation." en utilisant le serveur SMTP Gmail

D'où j'ai le code suivant ...

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

Cela fonctionne dans mon code de test. CEPENDANT, le processus réel que j'écris (plutôt que mon code de test) va s'exécuter en arrière-plan et ne peut pas réellement demander à l'utilisateur (il signale plutôt les erreurs dans le journal des erreurs de Windows).

Au début, ma question est vraiment pourquoi je reçois cette erreur du tout. Si je vais à https: webmail.ourdomain.co.uk dans un navigateur, il affiche un certificat valide et il n'y a aucune option pour installer le certificat (comme je l'aurais fait s'il avait été auto-signé).

Certificate Screenshot Cependant, lorsque je lance mon code, avec un pointage de pause de débogage dans la méthode ValidateServerCertificate, j’observe les valeurs du certificat et vois un émetteur de notre serveur local, puis "ne pas utiliser avant" et "ne pas utiliser après 'propriétés d'aujourd'hui. Cela ne correspond pas au certificat que je reçois.

J'ai également vérifié quels indicateurs sslPolicyErrors figurent dans le débogage de ValidateServerCertificate et affichent "RemoteCertificateChainErrors" et "RemoteCertificateNameMismatch".

Alors, qu'est-ce qui me manque à ce propos ... pourquoi n'utilise-t-il pas le bon certificat? S'il y a des étapes à suivre pour installer le certificat localement afin qu'il puisse être utilisé, je dois les connaître afin de pouvoir dire à mes clients ce qu'ils doivent faire s'ils l'obtiennent.

Je ne veux pas simplement contourner le contrôle en renvoyant true à partir de la méthode ValidateServerCertificate, et comme il s'agit d'un processus en arrière-plan, je ne peux pas demander à l'utilisateur. J'ai donc besoin de comprendre comment obtenir mon code pour utiliser le code correct/sécurisé. certificat.

J'espère que quelqu'un peut conseiller.

15
RosieC

La réponse que j’ai finalement trouvée est que le service SMTP sur le serveur n’utilise pas le même certificat que https.

Les étapes de diagnostic que j'ai lues ici supposent qu'elles utilisent le même certificat et chaque fois que j'ai déjà essayé, les étapes de diagnostic sont exactement ce que j'ai fait pour résoudre le problème plusieurs fois .

Dans ce cas, ces étapes n’ont pas fonctionné car les certificats utilisés étaient différents, et je n’en ai jamais eu la possibilité.

La solution consiste à exporter le certificat réel du serveur, puis à l'installer en tant que certificat approuvé sur ma machine, ou à obtenir un autre certificat valide/approuvé pour le service SMTP sur le serveur. C’est actuellement avec notre service informatique qui administre les serveurs pour décider de ce qu’ils veulent faire.

7
RosieC

Ancien message, mais comme vous l'avez dit "Pourquoi n'utilise-t-il pas le bon certificat?", J'aimerais vous proposer un moyen de savoir quel certificat SSL est utilisé pour SMTP (voir ici ), ce qui nécessitait une ouverture de serveur:

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

Ceci décrira le certificat SSL utilisé pour le service SMTP. Selon ce que vous voyez ici, vous pouvez remplacer le mauvais certificat (comme vous l'avez déjà fait) par un certificat correct (ou faire confiance au certificat manuellement).

2
BastianW

Ancien post, mais je pensais partager ma solution car il n’existait pas beaucoup de solutions à ce problème.

Si vous utilisez un ancien ordinateur Windows Server 2003, vous devrez probablement installer un correctif logiciel (KB938397). 

Ce problème se produit car l'API de cryptographie 2 (CAPI2) dans Windows Server 2003 ne prend pas en charge la famille d'algorithmes de hachage SHA2 . CAPI2 est la partie de l’API de cryptographie qui gère les certificats.

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

Pour une raison quelconque, Microsoft souhaite vous envoyer ce correctif par courrier électronique au lieu de vous permettre de télécharger directement. Voici un lien direct vers le correctif de l'email:

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

0
user1003916