Bagikan melalui


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 8 Tidak

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