Delen via


CA5359: Certificaatvalidatie niet uitschakelen

Eigenschappen Weergegeven als
Regel-id CA5359
Titel Certificaatvalidatie niet uitschakelen
Categorie Beveiliging
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

De callback die is toegewezen aan ServicePointManager.ServerCertificateValidationCallback altijd retourneert true.

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.

Schendingen oplossen

  • 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 gemachtigden echter helemaal 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 Codeanalysewaarschuwingen onderdrukken voor meer informatie.

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