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 9 | 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 SslPolicyErrorshodnota výčtu
None
.
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;
}
}