Obtenir "Le certificat distant est invalide selon la procédure de validation" lorsque le serveur SMPT possède un certificat valide
Cela semble une erreur commune, mais bien que j'ai trouvé un travail (voir ci-dessous) je ne peux pas cerner la raison pour laquelle je suis arriver en premier lieu.
Je suis en train d'écrire SMTP fonctionnalités de notre application, et je suis d'essayer d'ajouter la fonctionnalité SSL pour le travail SMTP que nous avons déjà.
Je suis en train de tester l'utilisation de notre société MS Exchange server et plus précisément le webmail option est activée. Je peux envoyer des e-mails en interne par le biais de mon code par pas authentifier ma connexion et l'envoi de façon anonyme, cependant, ces e-mails ne seront pas de relais à des adresses e-mail externes en raison de nos sociétés politiques. En outre, je suis de la programmation, cette pour nos clients, et ils ne sont pas tous d'autoriser l'ouverture de relais et/ou les connexions anonymes.
Je crois que le serveur Exchange est Explicite à l'aide de SSL/TLS. J'ai essayé de telnet à l'adresse du serveur sur le port 25 et a obtenu une réponse de texte, lisible par l'homme de la réponse, qui, selon certains de mes recherches précédemment signifie qu'il est Explicite à l'aide de SSL/TLS.
J'ai le test code 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 ce "La distance certificat n'est pas valide selon la procédure de validation." à l'aide de SMTP de Gmail serveur
À partir de laquelle j'ai obtenu 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. TOUTEFOIS, le processus réel je suis en train d'écrire (plutôt que mon code de test) va s'exécuter en arrière-plan et ne peut pas vraiment demander à l'utilisateur (au lieu de cela, il signale les erreurs dans windows journal des erreurs).
Que j'ai commencé, ma question est vraiment pourquoi je me fais de cette erreur. Si je vais à l'https:webmail.ourdomain.co.uk dans un navigateur, il montre un certificat valide et il n'y a pas d'option pour installer le certificat (comme je l'aurais fait si c'était un auto-signé).
Cependant, quand je lance mon code, avec un saut de débogage poing dans la ValidateServerCertificate méthode, je regarde le certificat de valeurs et de voir un émetteur de notre serveur et à ne pas utiliser avant", et "ne pas utiliser après" propriétés d'aujourd'hui. Cela ne correspond pas au certificat que j'obtiens.
J'ai également vérifié que le sslPolicyErrors les drapeaux sont dans le débogage de ValidateServerCertificate, et ils se montrent "RemoteCertificateChainErrors" et "RemoteCertificateNameMismatch".
Que suis-je en manquant à ce sujet... pourquoi n'est-il pas en utilisant le certificat correct? Si il y a des étapes à suivre pour installer le certificat localement pour qu'il utilise alors j'ai besoin de savoir afin que je puisse le dire à mes clients ce qu'ils doivent faire s'ils le reçoivent.
Je ne veux pas juste de passer outre le contrôle par retour véritable de la ValidateServerCertificate méthode, et parce que c'est un processus d'arrière-plan, je ne peux pas demander à l'utilisateur, donc j'ai besoin de comprendre comment obtenir mon code pour utiliser le bon/certificat de confiance.
Espère que quelqu'un pourra vous conseiller.
source d'informationauteur RosieC
Vous devez vous connecter pour publier un commentaire.
La réponse que j'ai enfin trouvé, c'est que le service SMTP sur le serveur n'est pas en utilisant le certificat https.
La les étapes de diagnostic que j'avais lu ici faire l'hypothèse qu'ils utilisent le même certificat et chaque fois que j'ai essayé dans le passé qu'ils ont fait et les étapes de diagnostic sont exactement ce que j'ai fait pour résoudre le problème plusieurs fois.
Dans ce cas, ces étapes ne fonctionnent pas parce que les certificats utilisés étaient différents, et la possibilité de ce qui est quelque chose que je n'avais jamais rencontré.
La solution consiste à exporter le certificat du serveur et de l'installer comme un certificat de confiance sur ma machine, ou pour obtenir une autre valide/certificat de confiance pour le service SMTP sur le serveur. Qui est actuellement avec notre département qui gère les serveurs de décider ce qu'ils veulent faire.
Vieux post, mais comme vous l'avez dit "pourquoi ne pas utiliser le certificat correct", je tiens à offrir un moyen de savoir quels certificat SSL est utilisé pour le SMTP (voir ici), openssl:
Cela donnera un aperçu de l'utilisé certificat SSL pour le service SMTP. Basé sur ce que vous voyez ici, vous pouvez remplacer le certificat incorrect (comme vous l'avez déjà fait) avec une bonne (ou une fiducie le certificat manuellement).
Vieux post, mais j'ai pensé que je voudrais partager ma solution, car il n'y a pas beaucoup de solutions à ce problème.
Si vous utilisez un vieux Windows Server 2003 de la machine, vous aurez probablement besoin d'installer un correctif (KB938397).
https://support.microsoft.com/en-us/kb/938397
Pour quelque raison que ce soit, Microsoft veut de vous envoyer ce correctif au lieu de vous permettant de télécharger directement. Voici un lien direct pour le correctif à partir de l'e-mail:
http://hotfixv4.microsoft.com/Windows Serveur 2003/sp3/Fix200653/3790/free/315159_ENU_x64_zip.exe