Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA5359 |
| Tytuł | Nie wyłączaj walidacji certyfikatów |
| Kategoria | Bezpieczeństwo |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Wywołanie zwrotne przypisane do ServicePointManager.ServerCertificateValidationCallback zawsze zwraca 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 ServicePointManager.ServerCertificateValidationCallback zawsze zwraca wartość true, wówczas każdy certyfikat będzie domyślnie przechodził 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 ServerCertificateValidationCallback, tylko wartość z ostatniego delegata jest brana pod uwagę, więc można bezpiecznie pomijać ostrzeżenia od innych delegatów. Możesz jednak zdecydować się na całkowite usunięcie nieużywanych delegatów.
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 pseudokodu
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;
}
}