Aracılığıyla paylaş


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
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

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

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. ServicePointManager.ServerCertificateValidationCallback her zaman döndürürsetrue, varsayılan olarak tüm sertifikalar tüm giden HTTPS istekleri için doğrulamayı geçirir.

İ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 sabit listesi değerinin SslPolicyErrors olup Noneolmadığını denetleyin.

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

öğesine birden çok temsilci ekliyse ServerCertificateValidationCallback, yalnızca son temsilcinin değerine uyulur, 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;
    }
}