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