CA5359: Inaktivera inte certifikatverifiering
Property | Värde |
---|---|
Regel-ID | CA5359 |
Title | Inaktivera inte certifikatverifiering |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Återanropet som tilldelas till ServicePointManager.ServerCertificateValidationCallback returnerar true
alltid .
Regelbeskrivning
Ett certifikat kan hjälpa dig att autentisera serverns identitet. Klienter bör verifiera servercertifikatet för att säkerställa att begäranden skickas till den avsedda servern. Om alltid ServicePointManager.ServerCertificateValidationCallback returnerar true
godkänns som standard alla certifikat för alla utgående HTTPS-begäranden.
Så här åtgärdar du överträdelser
- Överväg att åsidosätta certifikatverifieringslogik för specifika utgående HTTPS-begäranden som kräver anpassad certifikatverifiering, i stället för att åsidosätta den globala ServicePointManager.ServerCertificateValidationCallback.
- Tillämpa anpassad valideringslogik på endast specifika värdnamn och certifikat, och kontrollera i övrigt att uppräkningsvärdet SslPolicyErrors är
None
.
När du ska ignorera varningar
Om flera ombud är kopplade till ServerCertificateValidationCallbackrespekteras endast värdet från den senaste delegaten, så det är säkert att ignorera varningar från andra ombud. Du kanske vill ta bort de oanvända ombuden helt och hållet.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA5359
// The code that's violating the rule is on this line.
#pragma warning restore CA5359
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA5359.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Kränkning
using System.Net;
class ExampleClass
{
public void ExampleMethod()
{
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => { return true; };
}
}
Lösning
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;
}
}