CA5359: Nezakazujte ověření certifikátu

Vlastnost Hodnota
ID pravidla CA5359
Název Nezakazovat ověření certifikátu
Kategorie Zabezpečení
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Zpětné volání přiřazené vždy ServicePointManager.ServerCertificateValidationCallback vrátí true.

Popis pravidla

Certifikát může pomoct s ověřením identity serveru. Klienti by měli ověřit certifikát serveru, aby se zajistilo, že se požadavky posílají na zamýšlený server. ServicePointManager.ServerCertificateValidationCallback Pokud se vždy vrátí true, všechny certifikáty ve výchozím nastavení budou předávat ověření pro všechny odchozí požadavky HTTPS.

Jak opravit porušení

  • Zvažování přepsání logiky ověření certifikátu u konkrétních odchozích požadavků HTTPS, které vyžadují vlastní ověření certifikátu místo přepsání globálního ServicePointManager.ServerCertificateValidationCallbackcertifikátu .
  • Použijte vlastní logiku ověřování pouze na konkrétní názvy hostitelů a certifikáty a v opačném případě zkontrolujte, zda je Nonehodnota výčtu SslPolicyErrors .

Kdy potlačit upozornění

Pokud je k němu připojeno ServerCertificateValidationCallbackvíce delegátů , respektuje se pouze hodnota od posledního delegáta, takže je bezpečné potlačit upozornění od ostatních delegátů. Nepoužívané delegáty ale můžete úplně odebrat.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Porušení

using System.Net;

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

Řešení

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