Freigeben über


CA5359: Zertifikatüberprüfung nicht deaktivieren

Eigenschaft Wert
Regel-ID CA5359
Titel Zertifikatüberprüfung nicht deaktivieren
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 9 aktiviert No

Ursache

Der ServicePointManager.ServerCertificateValidationCallback zugewiesene Rückruf gibt immer true zurück.

Regelbeschreibung

Ein Zertifikat kann die Identität des Servers authentifizieren. Clients sollten das Serverzertifikat überprüfen, um sicherzustellen, dass Anforderungen an den vorgesehenen Server gesendet werden. Wenn ServicePointManager.ServerCertificateValidationCallback immer true zurückgibt, bestehen bei ausgehenden HTTPS-Anforderungen automatisch alle Zertifikate die Überprüfung.

Behandeln von Verstößen

  • Sie sollten die Zertifikatüberprüfungslogik für die jeweiligen ausgehenden HTTPS-Anforderungen überschreiben, für die eine benutzerdefinierte Überprüfung erforderlich ist, anstatt die globale Eigenschaft ServicePointManager.ServerCertificateValidationCallback zu überschreiben.
  • Wenden Sie die benutzerdefinierte Überprüfungslogik nur auf bestimmte Hostnamen und Zertifikate an, und überprüfen Sie darüber hinaus, ob der Enumerationswert SslPolicyErrors gleich None ist.

Wann sollten Warnungen unterdrückt werden?

Wenn mehrere Delegaten an ServerCertificateValidationCallback angefügt sind, wird nur der Wert des letzten Delegaten berücksichtigt. Warnungen von anderen Delegaten können also bedenkenlos unterdrückt werden. Sie sollten die nicht verwendeten Delegaten jedoch vollständig entfernen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA5359
// The code that's violating the rule is on this line.
#pragma warning restore CA5359

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA5359.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Pseudocodebeispiele

Verletzung

using System.Net;

class ExampleClass
{
    public void ExampleMethod()
    {
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => { return true; };
    }
}

Lösung

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

class ExampleClass
{
    public void ExampleMethod()
    {
        ServicePointManager.ServerCertificateValidationCallback += SelfSignedForLocalhost;
    }

    private static bool SelfSignedForLocalhost(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;
        }

        // For HTTPS requests to this specific host, we expect this specific certificate.
        // In practice, you'd want this to be configurable and allow for multiple certificates per host, to enable
        // seamless certificate rotations.
        return sender is HttpWebRequest httpWebRequest
                && httpWebRequest.RequestUri.Host == "localhost"
                && certificate is X509Certificate2 x509Certificate2
                && x509Certificate2.Thumbprint == "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                && sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors;
    }
}