CA5359: Nezakazujte ověření certifikátu

Vlastnost Hodnota
ID pravidla CA5359
Název Nezakazovat ověření certifikátu
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Zpětné volání přiřazené k ServicePointManager.ServerCertificateValidationCallback vždy 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. Pokud ServicePointManager.ServerCertificateValidationCallback vždy vrací true, pak ve výchozím nastavení projde jakýkoliv certifikát ověřením pro všechny odchozí požadavky HTTPS.

Jak opravit porušení

  • Zvažte 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řepisování globálního nastavení ServicePointManager.ServerCertificateValidationCallback.
  • Použijte vlastní logiku ověřování pouze pro určité názvy hostitelů a certifikáty, jinak zkontrolujte, zda je SslPolicyErrors hodnota výčtu None.

Kdy potlačit upozornění

Pokud je k ServerCertificateValidationCallback připojeno více delegátů, respektuje se pouze hodnota od posledního delegáta, takže je bezpečné ignorovat 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;
    }
}