Partilhar via


CA5359: Não desative a validação de certificado

Propriedade valor
ID da regra CA5359
Título Não desativar a validação de certificado
Categoria Segurança
A correção causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Não
Línguas aplicáveis C# e Visual Basic

Motivo

O retorno de chamada atribuído a ServicePointManager.ServerCertificateValidationCallback sempre retorna true.

Descrição da regra

Um certificado pode ajudar a autenticar a identidade do servidor. Os clientes devem validar o certificado do servidor para garantir que as solicitações sejam enviadas ao servidor pretendido. Se o ServicePointManager.ServerCertificateValidationCallback sempre retornar true, então, por padrão, qualquer certificado passará pela validação para todas as solicitações HTTPS de saída.

Como corrigir violações

  • Considerando substituir a lógica de validação de certificado nas solicitações específicas de saída HTTPS que exigem validação de certificado personalizada, em vez de substituir a validação global ServicePointManager.ServerCertificateValidationCallback.
  • Aplique a lógica de validação personalizada apenas a nomes de host e certificados específicos e, caso contrário, verifique se o SslPolicyErrors valor enum é None.

Quando suprimir avisos

Se vários delegados estiverem anexados ao ServerCertificateValidationCallback, apenas o valor do último delegado será considerado; por isso, é seguro ignorar os avisos de outros delegados. No entanto, convém remover totalmente os delegados não utilizados.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Violação

using System.Net;

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

Solução

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