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 powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | 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 true
wartość 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;
}
}