CA5359: Nie wyłączaj weryfikacji certyfikatu

Właściwości Wartość
Identyfikator reguły CA5359
Stanowisko Nie wyłączaj walidacji certyfikatów
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Wywołanie zwrotne przypisane do ServicePointManager.ServerCertificateValidationCallback funkcji zawsze zwraca wartość 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 zawsze zwraca truewartość ServicePointManager.ServerCertificateValidationCallback , domyślnie każdy certyfikat przejdzie 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 ServerCertificateValidationCallbackelementu , tylko wartość z ostatniego delegata jest przestrzegana, więc bezpieczne jest pomijanie ostrzeżeń od innych delegatów. Można jednak całkowicie usunąć nieużywane delegaty.

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 przykładów kodu przykładowego

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