Share via


CA5359: Inaktivera inte certifikatverifiering

Property Värde
Regel-ID CA5359
Rubrik Inaktivera inte certifikatverifiering
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Återanropet som tilldelas till ServicePointManager.ServerCertificateValidationCallback returnerar truealltid .

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