CA5359: No deshabilitar la validación de certificado

Propiedad Value
Identificador de la regla CA5359
Título No deshabilitar la validación de certificado
Categoría Seguridad
La corrección interrumpe o no interrumpe Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

La devolución de llamada asignada a ServicePointManager.ServerCertificateValidationCallback siempre devuelve true.

Descripción de la regla

Un certificado puede ayudar a autenticar la identidad del servidor. Los clientes deben validar el certificado del servidor para asegurarse de que las solicitudes se envían al servidor previsto. Si ServicePointManager.ServerCertificateValidationCallback siempre devuelve true, de forma predeterminada, cualquier certificado pasará la validación de todas las solicitudes HTTPS salientes.

Cómo corregir infracciones

  • Plantéese invalidar la lógica de validación de certificados en las solicitudes HTTPS de salida específicas que requieren una validación de certificados personalizada, en lugar de invalidar la propiedad ServicePointManager.ServerCertificateValidationCallback global.
  • Aplique la lógica de validación personalizada solo a los nombres de host y certificados específicos y, si no, compruebe que el valor de enumeración SslPolicyErrors es None.

Cuándo suprimir las advertencias

Si hay varios delegados asociados a ServerCertificateValidationCallback, solo se respeta el valor del último delegado, por lo que es seguro suprimir las advertencias de otros delegados. Sin embargo, recomendamos quitar completamente los delegados sin usar.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplos de pseudocódigo

Infracción

using System.Net;

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

Solución

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