2014-09-29 2 views
15

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

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

+0

Nun, ich denke, niemand kennt die Antwort darauf. Habe noch keine Lösung gefunden :( – RosieC

Antwort

7

Die Antwort, die ich schließlich gefunden habe, ist, dass der SMTP-Dienst auf dem Server nicht das gleiche Zertifikat wie https verwendet.

Die diagnostic steps I had read here machen die Annahme, dass sie das gleiche Zertifikat verwenden und jedes Mal, wenn ich das in der Vergangenheit versucht habe, haben sie getan und die Diagnoseschritte sind genau das, was ich getan habe, um das Problem mehrmals zu lösen.

In diesem Fall funktionierten diese Schritte nicht, weil die verwendeten Zertifikate unterschiedlich waren, und die Möglichkeit, dass dies etwas war, war ich nie begegnet.

Die Lösung besteht darin, entweder das eigentliche Zertifikat vom Server zu exportieren und es dann als vertrauenswürdiges Zertifikat auf meinem Computer zu installieren oder ein anderes gültiges/vertrauenswürdiges Zertifikat für den SMTP-Dienst auf dem Server abzurufen. Das ist derzeit bei unserer IT-Abteilung, die die Server verwaltet, um zu entscheiden, was sie tun wollen.

0

Alte Post, aber ich dachte, ich würde meine Lösung teilen, weil es nicht viele Lösungen für dieses Problem gibt.

Wenn Sie einen alten Windows Server 2003-Computer ausführen, müssen Sie wahrscheinlich einen Hotfix (KB938397) installieren.

Dieses Problem tritt auf, weil die Cryptography API 2 (CAPI2) in Windows Server 2003 nicht die SHA2-Familie von Hash-Algorithmen unterstützt. CAPI2 ist der Teil der Cryptography API, der Zertifikate verarbeitet.

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

Aus irgendeinem Grund will Microsoft Sie diesen Hotfix auf E-Mail statt mit dem Sie direkt zum Download bereit. Hier ist ein Link zu den Hotfix aus der E-Mail:

http://hotfixv4.microsoft.com/Windows Server 2003/sp3/Fix200653/3790/free/315159_ENU_x64_zip.exe

2

Alte Post, aber wie Sie gesagt haben: „Warum ist es nicht das richtige Zertifikat mit“ Ich möchte einen Weg bieten, um herauszufinden, welches SSL-Zertifikat für SMTP (siehe here), die openSSL benötigt:

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

Dies wird die verwendete SSL Zerti umreißen für den SMTP-Dienst. Basierend auf dem, was Sie hier sehen, können Sie das falsche Zertifikat (wie Sie es bereits getan haben) durch ein korrektes ersetzen (oder das Zertifikat manuell vertrauen).

Verwandte Themen