CA5359: Sertifika doğrulamayı devre dışı bırakma

Özellik Değer
Kural Kimliği CA5359
Başlık Sertifika doğrulamasını devre dışı bırakma
Kategori Güvenlik
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

ServicePointManager.ServerCertificateValidationCallback öğesine atanan geri arama her zaman true değerini döndürür.

Kural açıklaması

Sertifika, sunucunun kimliğini doğrulamaya yardımcı olabilir. İsteklerin istenen sunucuya gönderildiğinden emin olmak için istemciler sunucu sertifikasını doğrulamalıdır. Eğer ServicePointManager.ServerCertificateValidationCallback her zaman true dönerse, varsayılan olarak tüm sertifikalar tüm giden HTTPS istekleri için doğrulamadan geçer.

İhlalleri düzeltme

  • Genel ServicePointManager.ServerCertificateValidationCallbacksertifika doğrulamasını geçersiz kılma yerine özel sertifika doğrulaması gerektiren belirli giden HTTPS isteklerinde sertifika doğrulama mantığını geçersiz kılmayı göz önünde bulundurun.
  • Özel doğrulama mantığını yalnızca belirli konak adlarına ve sertifikalara uygulayın ve aksi durumda SslPolicyErrors numaralandırma değerinin None olduğundan emin olun.

Uyarıların ne zaman bastırılması gerekiyor?

Birden çok temsilci ServerCertificateValidationCallback öğesine eklenmişse, yalnızca son temsilcinin değeri göz önünde bulundurulur, bu nedenle diğer temsilcilerden gelen uyarıların gizlenmesi güvenlidir. Ancak, kullanılmayan temsilcileri tamamen kaldırmak isteyebilirsiniz.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Sahte kod örnekleri

Ihlal

using System.Net;

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

Çözüm

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