CA5359: Jangan nonaktifkan validasi sertifikat
Properti | Nilai |
---|---|
ID Aturan | CA5359 |
Judul | Jangan nonaktifkan validasi sertifikat |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Panggilan balik yang ditetapkan untuk ServicePointManager.ServerCertificateValidationCallback selalu mengembalikan true
.
Deskripsi aturan
Sertifikat dapat membantu mengautentikasi identitas server. Klien harus memvalidasi sertifikat server untuk memastikan permintaan dikirim ke server yang dituju.
ServicePointManager.ServerCertificateValidationCallback Jika selalu mengembalikan true
, maka secara default sertifikat apa pun akan melewati validasi untuk semua permintaan HTTPS keluar.
Cara memperbaiki pelanggaran
- Mempertimbangkan penggantian logika validasi sertifikat pada permintaan HTTPS keluar tertentu yang memerlukan validasi sertifikat kustom, alih-alih mengambil alih global ServicePointManager.ServerCertificateValidationCallback.
- Terapkan logika validasi kustom hanya ke nama host dan sertifikat tertentu, dan periksa apakah SslPolicyErrors nilai enum adalah
None
.
Kapan harus menekan peringatan
Jika beberapa delegasi dilampirkan ke ServerCertificateValidationCallback, hanya nilai dari delegasi terakhir yang dihormati, sehingga aman untuk menekan peringatan dari delegasi lain. Namun, Anda mungkin ingin menghapus delegasi yang tidak digunakan sepenuhnya.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA5359
// The code that's violating the rule is on this line.
#pragma warning restore CA5359
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA5359.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh kode semu
Pelanggaran
using System.Net;
class ExampleClass
{
public void ExampleMethod()
{
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => { return true; };
}
}
Solusi
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;
}
}