Comparteix a través de


CA5359: No deshabilitar la validación de certificado

Propiedad Valor
Identificador de la regla CA5359
Título No deshabilitar la validación de certificado
Categoría Seguridad
El arreglo es problemático o no problemático Sin interrupción
Habilitado de forma predeterminada en .NET 10 No
Idiomas aplicables C# y Visual Basic

Causa

La callback 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

  • Considere sobrescribir la lógica de validación de certificados en solicitudes HTTPS de salida específicas que requieren una validación de certificados personalizada, en lugar de sobrescribir la lógica global de ServicePointManager.ServerCertificateValidationCallback.
  • 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, puede que desee 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;
    }
}