CA5359: Zertifikatüberprüfung nicht deaktivieren
Eigenschaft | Wert |
---|---|
Regel-ID | CA5359 |
Titel | Zertifikatüberprüfung nicht deaktivieren |
Kategorie | Security |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Der ServicePointManager.ServerCertificateValidationCallback zugewiesene Rückruf gibt immer true
zurück.
Regelbeschreibung
Ein Zertifikat kann die Identität des Servers authentifizieren. Clients sollten das Serverzertifikat überprüfen, um sicherzustellen, dass Anforderungen an den vorgesehenen Server gesendet werden. Wenn ServicePointManager.ServerCertificateValidationCallback immer true
zurückgibt, bestehen bei ausgehenden HTTPS-Anforderungen automatisch alle Zertifikate die Überprüfung.
Behandeln von Verstößen
- Sie sollten die Zertifikatüberprüfungslogik für die jeweiligen ausgehenden HTTPS-Anforderungen überschreiben, für die eine benutzerdefinierte Überprüfung erforderlich ist, anstatt die globale Eigenschaft ServicePointManager.ServerCertificateValidationCallback zu überschreiben.
- Wenden Sie die benutzerdefinierte Überprüfungslogik nur auf bestimmte Hostnamen und Zertifikate an, und überprüfen Sie darüber hinaus, ob der Enumerationswert SslPolicyErrors gleich
None
ist.
Wann sollten Warnungen unterdrückt werden?
Wenn mehrere Delegaten an ServerCertificateValidationCallback angefügt sind, wird nur der Wert des letzten Delegaten berücksichtigt. Warnungen von anderen Delegaten können also bedenkenlos unterdrückt werden. Sie sollten die nicht verwendeten Delegaten jedoch vollständig entfernen.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA5359
// The code that's violating the rule is on this line.
#pragma warning restore CA5359
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA5359.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Pseudocodebeispiele
Verletzung
using System.Net;
class ExampleClass
{
public void ExampleMethod()
{
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => { return true; };
}
}
Lösung
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;
}
}