Partager via


CA5359 : Ne pas désactiver la validation de certificat

Propriété Value
Identificateur de la règle CA5359
Titre Ne pas désactiver la validation de certificat
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Le rappel affecté à ServicePointManager.ServerCertificateValidationCallback retourne toujours true.

Description de la règle

Un certificat peut vous aider à authentifier l’identité du serveur. Les clients doivent valider le certificat de serveur pour s’assurer que les demandes sont envoyées au serveur prévu. Si le ServicePointManager.ServerCertificateValidationCallback retourne toujours true, tout certificat par défaut réussira la validation pour toutes les requêtes HTTPS sortantes.

Comment corriger les violations

  • Envisagez de remplacer la logique de validation de certificat sur les requêtes HTTPS sortantes spécifiques qui nécessitent une validation de certificat personnalisée, au lieu de remplacer le ServicePointManager.ServerCertificateValidationCallback global.
  • Appliquez une logique de validation personnalisée uniquement à des noms d’hôte et des certificats spécifiques, sinon vérifiez que la valeur enum SslPolicyErrors est None.

Quand supprimer les avertissements

Si plusieurs délégués sont joints à ServerCertificateValidationCallback, seule la valeur du dernier délégué est respectée. Il est donc sûr de supprimer les avertissements des autres délégués. Toutefois, vous pouvez supprimer entièrement les délégués inutilisés.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemples de pseudo-code

Violation

using System.Net;

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

Solution

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