Udostępnij za pośrednictwem


CA5359: Nie wyłączaj weryfikacji certyfikatu

Właściwości Wartość
Identyfikator reguły CA5359
Tytuł Nie wyłączaj walidacji certyfikatów
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Wywołanie zwrotne przypisane do ServicePointManager.ServerCertificateValidationCallback zawsze zwraca true.

Opis reguły

Certyfikat może pomóc w uwierzytelnieniu tożsamości serwera. Klienci powinni zweryfikować certyfikat serwera, aby upewnić się, że żądania są wysyłane do zamierzonego serwera. Jeśli ServicePointManager.ServerCertificateValidationCallback zawsze zwraca wartość true, wówczas każdy certyfikat będzie domyślnie przechodził walidację dla wszystkich wychodzących żądań HTTPS.

Jak naprawić naruszenia

  • Rozważ zastąpienie logiki weryfikacji certyfikatu dla określonych wychodzących żądań HTTPS, które wymagają niestandardowej weryfikacji certyfikatu, zamiast zastępowania globalnego ServicePointManager.ServerCertificateValidationCallback.
  • Zastosuj niestandardową logikę walidacji tylko do określonych nazw hostów i certyfikatów, a w przeciwnym razie sprawdź, czy SslPolicyErrors wartość wyliczenia to None.

Kiedy pomijać ostrzeżenia

Jeśli wiele delegatów jest dołączonych do ServerCertificateValidationCallback, tylko wartość z ostatniego delegata jest brana pod uwagę, więc można bezpiecznie pomijać ostrzeżenia od innych delegatów. Możesz jednak zdecydować się na całkowite usunięcie nieużywanych delegatów.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady pseudokodu

Naruszenie

using System.Net;

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

Rozwiązanie

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;
    }
}