CA5359: Certificaatvalidatie niet uitschakelen

Eigenschap Waarde
Regel-id CA5359
Titel Certificaatvalidatie niet uitschakelen
Categorie Beveiliging
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

Oorzaak

De callback die is toegewezen aan ServicePointManager.ServerCertificateValidationCallback zal altijd true retourneren.

Beschrijving van regel

Een certificaat kan helpen bij het verifiëren van de identiteit van de server. Clients moeten het servercertificaat valideren om ervoor te zorgen dat aanvragen naar de beoogde server worden verzonden. Als het ServicePointManager.ServerCertificateValidationCallback altijd retourneert true, wordt standaard een certificaat gevalideerd voor alle uitgaande HTTPS-aanvragen.

Hoe schendingen op te lossen

  • Overweeg het overschrijven van certificaatvalidatielogica voor de specifieke uitgaande HTTPS-aanvragen waarvoor aangepaste certificaatvalidatie is vereist, in plaats van het globale ServicePointManager.ServerCertificateValidationCallbackte overschrijven.
  • Pas aangepaste validatielogica toe op alleen specifieke hostnamen en certificaten en controleer anders of de SslPolicyErrors enumwaarde is None.

Wanneer waarschuwingen onderdrukken

Als er meerdere gemachtigden aan zijn gekoppeld ServerCertificateValidationCallback, wordt alleen de waarde van de laatste gemachtigde gerespecteerd, zodat het veilig is om waarschuwingen van andere gemachtigden te onderdrukken. U kunt de ongebruikte gedelegeerden echter volledig verwijderen.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA5359
// The code that's violating the rule is on this line.
#pragma warning restore CA5359

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA5359.severity = none

Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Voorbeelden van pseudocode

Schending

using System.Net;

class ExampleClass
{
    public void ExampleMethod()
    {
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => { return true; };
    }
}

Oplossing

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;
    }
}