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 9'da 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
None
olmadığı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 none
olarak 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;
}
}