Dies scheint ein häufiger Fehler zu sein, aber während ich einen Workaround gefunden habe (siehe unten), kann ich den Grund nicht feststellen Ich bekomme es an erster Stelle.Abrufen "Das Remotezertifikat ist gemäß dem Überprüfungsverfahren ungültig", wenn SMPT-Server über ein gültiges Zertifikat verfügt
Ich schreibe SMTP-Funktionalität in unsere Anwendung und ich versuche, die funktionierende SMTP, die wir bereits haben, SSL-Funktionalität hinzuzufügen.
Ich teste mit dem MS Exchange-Server unseres Unternehmens und speziell die Webmail-Option, die darauf aktiviert ist. Ich kann E-Mails intern über meinen Code senden, indem ich meine Verbindung nicht authentifiziere und anonym sende, aber diese E-Mails werden aufgrund unserer Unternehmensrichtlinien nicht an externe E-Mail-Adressen weitergeleitet. Nebenbei programmiere ich das für unsere Kunden und sie erlauben nicht alle offene Relay- und/oder anonyme Verbindungen.
Ich glaube, der Exchange-Server verwendet explizite SSL/TLS. Ich habe versucht, telnet an die Adresse des Servers auf Port 25 und erhielt eine Textantwort, menschliche lesbare Antwort, die nach einigen meiner Recherchen zuvor bedeutet, dass es explizite SSL/TLS verwendet.
Ich habe den folgenden Testcode
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);
Während meiner Suche nach einer Lösung, ich auf diese kam "The remote certificate is invalid according to the validation procedure." using Gmail SMTP server
aus dem ich den folgenden Code bekam ...
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;
}
}
Diese funktioniert in meinem Testcode. JEDOCH läuft der eigentliche Prozess, den ich schreibe (und nicht mein Testcode), im Hintergrund und kann den Benutzer nicht wirklich fragen (stattdessen meldet er Fehler im Windows-Fehlerprotokoll).
Als ich angefangen habe, ist meine Frage wirklich, warum ich diesen Fehler überhaupt bekomme. Wenn ich auf https: webmail.ourdomain.co.uk in einem Browser gehe, wird ein gültiges Zertifikat angezeigt und es gibt keine Option, das Zertifikat zu installieren (wie ich es getan hätte, wenn es ein selbstsigniertes Zertifikat wäre).
Allerdings, wenn ich meinen Code ausführen, mit einer Debug-Pause poing im ValidateServerCertificate Methode, sehe ich die Zertifikatwert und einen Emittenten unseres lokalen Servers sehen und ‚nicht verwenden, bevor‘ und ‚don‘ t verwenden nach 'Eigenschaften von heute. Dies stimmt nicht mit dem Zertifikat überein, das ich erhalte.
Ich habe auch überprüft, was die sslPolicyErrors Flags im Debug von ValidateServerCertificate sind, und sie zeigen "RemoteCertificateChainErrors" und "RemoteCertificateNameMismatch".
Also was vermisse ich an diesem ... warum verwendet es nicht das richtige Zertifikat? Wenn es Schritte gibt, die ich ergreifen muss, um das Zertifikat lokal zu installieren, muss ich sie kennen, damit ich meinen Kunden sagen kann, was zu tun ist, wenn sie das bekommen.
Ich möchte nicht nur die Prüfung umgehen, indem ich true von der ValidateServerCertificate-Methode zurückschicke, und weil es ein Hintergrundprozess ist, kann ich den Benutzer nicht fragen, also muss ich verstehen, wie ich meinen Code verwenden kann das richtige/vertrauenswürdige Zertifikat.
Hoffe jemand kann beraten.
Nun, ich denke, niemand kennt die Antwort darauf. Habe noch keine Lösung gefunden :( – RosieC