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