"Das Remote-Zertifikat ist gemäß dem Validierungsverfahren ungültig." Verwenden des Google Mail-SMTP-Servers

222

Ich erhalte diesen Fehler:

Das Remote-Zertifikat ist gemäß dem Validierungsverfahren ungültig.

Wann immer ich versuche, E-Mails über den SMTP-Server von Google Mail in meinem C # -Code zu senden. Kann mich jemand in die richtige Richtung weisen, um eine Lösung für dieses Problem zu finden?

Das Folgende ist die Stapelverfolgung ...

at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at BulkEmail.frmemail.mailsending(String toaddress, String fromaddress, String fromname, String subject, String pwd, String attachements, String mailmessage, String htmlmessage, Int32 i, Int32 j, String replytoaddress)
Josh
quelle
1
Können Sie uns mehr über Ihre Konfiguration für die Verwendung von Google Mail-SMTP-Servern erzählen? Meine glückliche Vermutung: Können Sie uns mehr über Ihre Sicherheitsrichtlinien für SSL erzählen (z. B. die Verwendung eines gültigen / ungültigen SSL-Zertifikats?).
Brian Clozel
Können Sie uns ein Codebeispiel geben, in dem Sie den Fehler reproduzieren können?
zaTricky

Antworten:

302

Warnung: Verwenden Sie dies nicht im Produktionscode!

Um dieses Problem zu umgehen, können Sie die Zertifikatsüberprüfung deaktivieren. Tun Sie dies immer nur, um die Bestätigung zu erhalten, dass der Fehler aufgrund eines fehlerhaften Zertifikats ausgelöst wird.

Rufen Sie diese Methode auf, bevor Sie Folgendes aufrufen smtpclient.Send():

    [Obsolete("Do not use this in Production code!!!",true)]
    static void NEVER_EAT_POISON_Disable_CertificateValidation()
    {
        // Disabling certificate validation can expose you to a man-in-the-middle attack
        // which may allow your encrypted message to be read by an attacker
        // https://stackoverflow.com/a/14907718/740639
        ServicePointManager.ServerCertificateValidationCallback =
            delegate (
                object s,
                X509Certificate certificate,
                X509Chain chain,
                SslPolicyErrors sslPolicyErrors
            ) {
                return true;
            };
    }
Yury Skaletskiy
quelle
174
Dies ist ein Hack, kein Fix?
LB.
88
Würde gerne eine Lösung sehen, anstatt die gesamte Sicherheit vollständig auszuschalten.
Roman Starkov
71
Um dieses Problem zu umgehen, können Sie die Sicherheit deaktivieren. WTF?
John Nicholas
68
Musste dies ablehnen, da die Leute immer noch zu denken scheinen, dass es eine Lösung ist. Es schaltet nur die Sicherheit aus. NICHT IN DER PRODUKTION VERWENDEN , Leute. Er sagt es sogar. Meine Güte.
MGOwen
51
Upvoted. Ich stimme voll und ganz zu, dass dies nicht in der Produktion verwendet werden sollte, ABER ich mache einen Prototyp von etwas. Der Testserver, den sie mir zufällig zur Verfügung gestellt haben, zwingt mich, SSL zu verwenden. Arbeiten mit Zertifikaten ist ziemlich neu für mich, so dass ich möchte nur ein QUICK WAY OUT , was imho ist in Ordnung , da ich nicht in der Produktion verwenden
TweeZz
58

Der Link hier hat mein Problem gelöst.

http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html

Ich ging zur URL des Webdienstes (auf dem Server, auf dem das Problem aufgetreten war) und klickte auf das kleine Sicherheitssymbol im IE, das das Zertifikat aufrief. Ich klickte dann auf die Registerkarte Details und dann auf die Schaltfläche In Datei kopieren, wodurch ich das Zertifikat als CER-Datei exportieren konnte. Nachdem ich das Zertifikat lokal hatte, konnte ich es mithilfe der folgenden Anweisungen in den Zertifikatspeicher auf dem Server importieren.

Starten Sie eine neue MMC. Datei -> Snap-In hinzufügen / entfernen ... Klicken Sie auf Hinzufügen ... Wählen Sie Zertifikate und klicken Sie auf Hinzufügen. Aktivieren Sie das Optionsfeld "Computerkonto". Weiter klicken.

Wählen Sie im nächsten Bildschirm den Client-Computer aus. Klicken Sie auf Fertig stellen. Klicken Sie auf Schließen. OK klicken. Installieren Sie das Zertifikat JETZT im Zertifikatspeicher der vertrauenswürdigen Stammzertifizierungsstellen. Dadurch können alle Benutzer dem Zertifikat vertrauen.

T-Rex
quelle
+1 beim Importieren eines Zertifikats über das Import-Tool auf dem Zertifikat und nicht über das Snap-In, sondern nur für Ihr Benutzerkonto. Mit dem Snap-In können Sie auswählen, für wen der Import bestimmt ist, für welches Benutzerkonto, für jedes Dienstkonto oder für alle Personen. Danke für deinen Hinweis. Ich kratzte mir dort ein oder zwei Minuten am Kopf!
Davidb
Wenn Sie die Befehlszeile verwenden möchten, um über alle Entwicklungs- / Testarbeitsstationen zu automatisieren - certutil -f -p test -importPFX Root devcert.pfxund certutil -f -p test -importPFX MY devcert.pfx . test
Muss
Dies ist der beste Weg, um das Problem zu beheben, wenn Sie zum Testen ein selbstsigniertes Zertifikat verwenden, danke T-Rex!
ToastyMallows
37

Sie können den Code verbessern, indem Sie den Benutzer fragen, ob das Zertifikat ungültig ist, ob er fortfahren möchte oder nicht. Wollen Sie fortfahren? Wie nachstehend:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Und fügen Sie eine Methode wie diese hinzu:

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;
    }
}
LinuxLover
quelle
50
Wer klickt auf die Schaltfläche "Weiter", wenn es sich um eine Cloud-App handelt?
Konstantin Isaev
34

Ein bisschen zu spät zur Party, aber wenn Sie nach einer Lösung wie der von Yury suchen, hilft Ihnen der folgende Code zu identifizieren, ob das Problem mit einem Selbstsignaturzertifikat zusammenhängt, und wenn ja, ignorieren Sie den Selbstsignaturfehler. Sie können natürlich nach anderen SSL-Fehlern suchen, wenn Sie dies wünschen.

Der von uns verwendete Code (mit freundlicher Genehmigung von Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) lautet wie folgt:

  private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
  // If the certificate is a valid, signed certificate, return true.
  if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
  {
    return true;
  }

  // If there are errors in the certificate chain, look at each error to determine the cause.
  if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
  {
    if (chain != null && chain.ChainStatus != null)
    {
      foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
      {
        if ((certificate.Subject == certificate.Issuer) &&
           (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
        {
          // Self-signed certificates with an untrusted root are valid. 
          continue;
        }
        else
        {
          if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
          {
            // If there are any other errors in the certificate chain, the certificate is invalid,
         // so the method returns false.
            return false;
          }
        }
      }
    }

    // When processing reaches this line, the only errors in the certificate chain are 
// untrusted root errors for self-signed certificates. These certificates are valid
// for default Exchange server installations, so return true.
    return true;
  }
  else
  {
 // In all other cases, return false.
    return false;
  }
}
Hooligancat
quelle
1
In meinem Fall war sslPolicyErrors RemoteCertificateNameMismatch, und ich habe die Zertifikatsprüfung geändert, da wir nicht dieselben Betreff- und Ausstellerwerte hatten.
Ufuk Hacıoğulları
2
Das vom Exchange-Server verwendete X509-Zertifikat wechselte ständig zwischen einem selbstsignierten und einem vertrauenswürdigen Zertifikat. Die Verwendung dieses Codes half meinem Netzwerkadministrator und mir nicht nur herauszufinden, dass dies der Fall war, sondern löste das Problem auch insgesamt, indem nur die selbstsignierten Zertifikate umgangen wurden. Das war perfekt!
Bret
20

Ich hatte genau das gleiche Problem und stellte fest, dass beim Mail Shield von Avast Antivirus standardmäßig die "SSL-Verbindung scannen" aktiviert war. Stellen Sie sicher, dass Sie das ausschalten .

Meines Wissens nach "öffnet" Avast die E-Mail, scannt sie auf Viren und signiert sie dann mit einem eigenen Zertifikat, damit die E-Mail nicht mehr vom Google Mail-Zertifikat signiert wird, was diesen Fehler verursacht.

Lösung 1:

  • Deaktivieren Sie die SSL-Scans von Ihrem Antivirenprogramm (oder dem gesamten E-Mail-Schutzschild).

Lösung 2 (sollte die beste Sicherheit sein):

  • Holen Sie sich irgendwie das vom Antivirus verwendete Zertifikat (Avast hat eine Option zum Exportieren)
  • Importieren Sie es in Ihren imap / pop / smtp-Client, bevor Sie eine Verbindung zum Google Mail-Server herstellen.
Der Zivilist
quelle
1
Du hast mir so viel Zeit gespart. Es hätte ewig gedauert, um herauszufinden, dass mein Antivirenprogramm schuld ist und nicht mein Code.
Arao6
13

Erhalten Sie den gleichen Fehler beim Senden aus Outlook wegen ssl. Versuchte Einstellung EnableSSL = false hat das Problem behoben.

Beispiel:

var smtp = new SmtpClient
                {
                    Host = "smtp.gmail.com",                   
                    Port = 587,
                    EnableSsl = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    UseDefaultCredentials = false,                   
                    Credentials = new NetworkCredential("[email protected]", "xxxxx")
                };
Chitra Pannirselvam
quelle
3
In Google Mail können Sie keine Verbindung herstellen, während Sie SSL auf false setzen. Ich habe Ihre Lösung ausprobiert, die bei mir nicht funktioniert hat.
Zeeshan Ajmal
Ja, das nenne ich "grundlegend" (vs "keine" oder "ssl") ....... diese E-Mail-Einstellungen sind manchmal schwierig.
GranadaCoder
9

Sind Sie sicher, dass Sie die richtige SMTP-Serveradresse verwenden?

Sowohl smtp.google.com als auch smtp.gmail.com funktionieren, aber das SSL-Zertifikat wird für das zweite ausgestellt.

Pawel Lesnikowski
quelle
9

Ich hatte den gleichen Fehler, als ich versuchte, E-Mails mit zu senden SmtpClient über einen Proxyserver (Usergate) .

Überprüft, ob das Zertifikat die Adresse des Servers enthält, die nicht der Adresse des Proxyservers entspricht, daher der Fehler. Meine Lösung: Wenn beim Überprüfen des Zertifikats ein Fehler auftritt, empfangen Sie das Zertifikat, exportieren Sie es und überprüfen Sie es.

public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        // if got an cert auth error
        if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
        const string sertFileName = "smpthost.cer";

        // check if cert file exists
        if (File.Exists(sertFileName))
        {
            var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
            return certificate.Equals(actualCertificate);
        }

        // export and check if cert not exists
        using (var file = File.Create(sertFileName))
        {
            var cert = certificate.Export(X509ContentType.Cert);
            file.Write(cert, 0, cert.Length);
        }
        var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(createdCertificate);
    }

Vollständiger Code meiner E-Mail-Absenderklasse:

public class EmailSender
{
    private readonly SmtpClient _smtpServer;
    private readonly MailAddress _fromAddress;

    public EmailSender()
    {
        ServicePointManager.ServerCertificateValidationCallback = RemoteServerCertificateValidationCallback;
        _smtpServer = new SmtpClient();
    }

    public EmailSender(string smtpHost, int smtpPort, bool enableSsl, string userName, string password, string fromEmail, string fromName) : this()
    {
        _smtpServer.Host = smtpHost;
        _smtpServer.Port = smtpPort;
        _smtpServer.UseDefaultCredentials = false;
        _smtpServer.EnableSsl = enableSsl;
        _smtpServer.Credentials = new NetworkCredential(userName, password);

        _fromAddress = new MailAddress(fromEmail, fromName);
    }

    public bool Send(string address, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        return Send(new List<MailAddress> { new MailAddress(address) }, mailSubject, htmlMessageBody, fileName);
    }

    public bool Send(List<MailAddress> addressList, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        var mailMessage = new MailMessage();
        try
        {
            if (_fromAddress != null)
                mailMessage.From = _fromAddress;

            foreach (var addr in addressList)
                mailMessage.To.Add(addr);

            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Subject = mailSubject;

            mailMessage.Body = htmlMessageBody;
            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.IsBodyHtml = true;

            if ((fileName != null) && (System.IO.File.Exists(fileName)))
            {
                var attach = new Attachment(fileName, MediaTypeNames.Application.Octet);
                attach.ContentDisposition.CreationDate = System.IO.File.GetCreationTime(fileName);
                attach.ContentDisposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
                attach.ContentDisposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
                mailMessage.Attachments.Add(attach);
            }
            _smtpServer.Send(mailMessage);
        }
        catch (Exception e)
        {
            // TODO lor error
            return false;
        }
        return true;
    }

    public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    // if got an cert auth error
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
    const string sertFileName = "smpthost.cer";

    // check if cert file exists
    if (File.Exists(sertFileName))
    {
        var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(actualCertificate);
    }

    // export and check if cert not exists
    using (var file = File.Create(sertFileName))
    {
        var cert = certificate.Export(X509ContentType.Cert);
        file.Write(cert, 0, cert.Length);
    }
    var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
    return certificate.Equals(createdCertificate);
}

}}

Evgeny Ivanov
quelle
7

Ich weiß, dass ich ziemlich spät in diesem Spiel bin, aber ich habe hier keine Antwort gesehen, die auf die system.diagnostics-Protokolle für den TLS-Stream verweist.

Bevor Sie Änderungen an Ihrem Code vornehmen, stellen Sie sicher, dass Sie verstehen, worum es bei dem Problem geht. Das AuthenticationExceptionist eine dieser sehr allgemeinen Ausnahmen, die nicht viel sagt. Um zu erfahren, was unter der Haube vor sich geht, bearbeiten Sie die Datei app.config für Ihre Anwendung (oder erstellen Sie eine neue) und stellen Sie sicher, dass im Abschnitt die System.Net-Tracequelle aktiviert system.diagnosticsist. Beispiel:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" />
    <sharedListeners>
      <add name="file" initializeData="c:\network.log" type="System.Diagnostics.TextWriterTraceListener" />
    </sharedListeners>
    <sources>
      <source name="System.Net" switchValue="Verbose">
        <listeners>
          <add name="file" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Führen Sie Ihre Anwendung erneut aus und überprüfen Sie die Datei c: \ network.log. Dort sollten detaillierte Informationen zu Ihrer TLS (SSL) -Verbindung angezeigt werden, zum Beispiel:

System.Net Information: 0 : [12764] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = f44368:535f958, targetName = localhost, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [12764] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [12764] Remote certificate: [Version]
  V3

[Subject]
  CN=test
  Simple Name: test
  DNS Name: example.com

[Issuer]
  CN=Root CA
  Simple Name: Root CA
  DNS Name: Root CA

...

[Signature Algorithm]
  sha256RSA(1.2.840.113549.1.1.11)

[Public Key]
  Algorithm: RSA
  Length: 2048
  Key Blob: ....
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate has errors:
System.Net Information: 0 : [12764] SecureChannel#38496415 -    Certificate name mismatch.
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate was verified as invalid by the user.
System.Net Error: 0 : [12764] Exception in AppDomain#10923418::UnhandledExceptionHandler - The remote certificate is invalid according to the validation procedure..

Wenn Sie wissen, was das Problem verursacht, sollten Sie es beheben oder zumindest Ihre Google-Suche eingrenzen können.

lowleveldesign
quelle
6

Mein Problem war unter Windows 2003 Server beim Aufrufen von AuthenticateAsClient. Die oben genannten Lösungen (z. B. UmgehenServicePointManager.ServerCertificateValidationCallback ) haben nicht funktioniert.

Es stellt sich heraus, dass dies ein Fehler in Windows 2003 ist und es einen Hotfix gibt:

"Anwendungen, die die Kryptografie-API verwenden, können ein X.509-Zertifikat in Windows Server 2003 nicht validieren."

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

Durch die Installation dieses Hotfixes wurde mein Problem behoben.

user326608
quelle
4

Ihr Website-Ordner benötigt Netzwerkdienstsicherheit. Besonders die web.config. Es verwendet dieses Konto, um auf Ihre Registrierung für die Zertifikate zuzugreifen. Dadurch müssen Sie Ihrem Code keinen Hack mehr hinzufügen.

Frans
quelle
4

Mein Problem war nicht, dass ich den Server anhand der IP-Adresse anstelle der URL referenzierte. Ich hatte ein signiertes Zertifikat von einer Zertifizierungsstelle zur Verwendung in einem privaten Netzwerk gekauft. Die im Zertifikat angegebene URL spielt beim Verweisen auf den Server eine Rolle. Nachdem ich den Server über die URL im Zertifikat referenziert hatte, begann alles zu funktionieren.

Josh
quelle
Diese Antwort verdient es, höher zu sein, weil sie auf einen häufigen Fehler hinweist; Leute (einschließlich ich) denken, dass der Zweck von Host nur darin besteht, den Server zu finden.
Mojtaba
4

Überprüfen Sie Datum und Uhrzeit Ihres Computers. Wenn es falsch ist, aktualisieren Sie es auf die aktuelle Zeit oder stellen Sie es automatisch ein, um die Zeit aus dem Internet abzurufen.

Da Zertifikate an einen festen Zeitraum gebunden sind, werden Sie wahrscheinlich Fehler wie diese erhalten, wenn Ihre Uhr falsch ist. In diesem Szenario wird das Problem durch Festlegen der Zeit behoben.

AliSafari186
quelle
1
Wenn Ihr Systemdatum "zu weit" von der aktuellen Uhrzeit entfernt ist, verursacht die Gültigkeit des von Google erhaltenen Zertifikats ein Problem. Es sieht ausgestellt auf und gültig für Informationen, die nicht viel aktuelle Zeit. Dies ist nicht die einzige Sache, die dieses Problem nicht verursachen kann. Aber es ist sicherlich eines, das kann.
Phil Soady
1
Eine äußerst nützliche Erinnerung, um dies in meinem Fall noch einmal zu überprüfen! Occam's Razor und all das ... :) Nun zu dieser CMOS-Batterie ...
Mike G
2

In unserem Fall wurde das Problem durch das IIS-Serverzertifikat verursacht. Der Betreff des Zertifikats wurde auf den DNS-Namen festgelegt, und Benutzer haben versucht, über die IP-Adresse auf die Website zuzugreifen, sodass die Überprüfung der .NET-Zertifizierung fehlgeschlagen ist. Das Problem verschwand, als Benutzer den DNS-Namen verwendeten.

Sie müssen also Ihre Provider-URL in https: //CertificateSubject/xxx/xxx.application ändern

Ludwo
quelle
Können Sie das näher erläutern? In meinem Fall funktioniert die App auf einem Server und nicht auf dem anderen. Ich bin ahnungslos ... Ich bin kein Experte, aber die Domain ist immer noch mit der funktionierenden verbunden, und auf beiden Computern ist bereits ein Serverzertifikat installiert. Ich verstehe immer noch nicht, warum das irgendwie relevant sein könnte, da dort "Remote-Zertifikat" steht.
Michael Brennt
1

Das Hinzufügen dieser Zeile hat bei mir funktioniert. Dies vertraut in der Tat allen hier erwähnten Zertifikaten . Dies kann jedoch hauptsächlich zur Fehlerbehebung verwendet werden. Wenn dies für Sie funktioniert, bedeutet dies, dass das Zertifikat des Remoteservers nicht als vertrauenswürdiges Zertifikat auf Ihrem Computer hinzugefügt wird.

System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);

Vollständiger Code ist

private void sendAMail(String toAddress, String messageBody)
        {
            String msg = "Sending mail to : " + toAddress;

            MailMessage mail = new MailMessage();
            mail.To.Add(toAddress);
            mail.From = new MailAddress("[email protected]");
            mail.Subject = "Subject: Test Mail";
            mail.Body = messageBody;
            mail.IsBodyHtml = true;            

            //Added this line here
            System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
            SmtpClient smtp = new SmtpClient();

            smtp.Host = "myhostname.com";            
            smtp.Credentials = new System.Net.NetworkCredential("[email protected]", "");
            smtp.EnableSsl = true;
            smtp.Port = 587;            
            smtp.Send(mail);            
        }


private bool RemoteServerCertificateValidationCallback(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    //Console.WriteLine(certificate);
    return true;
}
Erdnase
quelle
0

Es hat mein Problem gelöst

smtpClient.Credentials = new NetworkCredential(sendMail.UserName, sendMail.Password);
smtpClient.EnableSsl = false;//sendMail.EnableSSL;

// Mit Bezug auf // Problem tritt nur auf Verwenden Sie die obige Zeile, um false SSl festzulegen, um Fehler zu beheben, wenn Benutzername und Passwort in den SMTP-Einstellungen eingegeben werden.

user3584038
quelle
13
Dies schaltet auch die Sicherheit aus.
Zoey
0

Hier ist die Lösung, für die ich mich entschieden habe.

        ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            string name = certificate.Subject;

            DateTime expirationDate = DateTime.Parse(certificate.GetExpirationDateString());

            if (sslPolicyErrors == SslPolicyErrors.None || (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch && name.EndsWith(".acceptabledomain.com") && expirationDate > DateTime.Now))
            {
                return true;
            }
            return false;
        };
Der faule Codierer
quelle
0

Der Code aus der akzeptierten Antwort half mir, das Problem zu beheben. Dann wurde mir klar, dass das SN-Feld des certificateArguments nicht mit dem übereinstimmte, was ich für meinen SMTP-Server hielt. Durch Setzen der HostEigenschaft der SmtpClient-Instanz auf den SN-Wert des Zertifikats konnte ich das Problem beheben.

ulu
quelle