Apa perbedaan antara X509Certificate2 dan X509Certificate di .NET?

Jawaban:

106

The X509Certificate diperkenalkan di NET v1.0 / 1.1 dan (relatif) terbatas dalam fungsinya. Ini dapat digunakan untuk mendapatkan informasi tentang sertifikat yang ada (tanggal valid, penerbit, dll.). Itu memiliki metode / operasi sederhana (yaitu membaca sertifikat dari disk).

The x509Certificate2 adalah subclass dari X509Certificate dengan fungsi tambahan.

  • Ini mewakili sertifikat X509 yang sebenarnya.
  • Itu baru di .NET Framework v2.0.
  • Kelas ini memberi Anda akses ke semua properti V2 dan V3 (pengidentifikasi kunci otoritas dan penggunaan kunci).
  • Ini mendukung memuat sertifikat dari penyimpanan sertifikat.
p. campbell
sumber
12
X509Certificate2juga memiliki anggota untuk kunci privat, yang bukan merupakan bagian dari sertifikat itu sendiri tetapi nyaman untuk dikaitkan dengan kelas yang mewakili sertifikat X.509.
Bruno
21

Demi kelengkapan, berikut ini salinan dari bagian relevan dari situs yang ditautkan ke jawaban @ dommer, karena situs tersebut mungkin tidak lagi aktif dan hanya ada di cache Google untuk entah berapa lama:

Versi 1.1 kerangka kerja memiliki sangat sedikit selain kelas X509Certificate yang memungkinkan Anda memanipulasi sertifikat. Faktanya, kelas X509Certificate v1.1 hanya memberikan dukungan dasar: kelas ini hanya memberikan akses ke bidang X509 versi 1 (seperti yang valid dari dan valid hingga tanggal, subjek dan kunci publik), tetapi bukan bidang versi 2 (seperti pengenal kunci otoritas ) atau bidang versi 3 (seperti penggunaan kunci). Tidak ada dukungan untuk memuat sertifikat dari penyimpanan sertifikat, juga tidak memiliki fasilitas untuk mengakses daftar pencabutan sertifikat atau daftar kepercayaan sertifikat. Microsoft meningkatkan hal ini dengan toolkit Peningkatan Layanan Web (WSE) yang memperluas kelas sertifikat dan menyediakan kelas untuk mengakses penyimpanan sertifikat. Kelas-kelas ini sekarang dapat ditemukan di pustaka kerangka kerja .NET 3.0 / 2.0.

Perubahan besar pertama adalah kelas baru yang disebut X509Certificate2 yang berasal dari X509Certificate. Metode untuk mengakses bidang sertifikat X509 sudah tidak digunakan lagi dan sekarang kelas memiliki properti untuk mengakses bidang tersebut. Selain itu, jika sertifikat memiliki kunci pribadi terkait maka kelas memberikan akses ke kunci ini. Ada metode yang memungkinkan Anda memberikan kata sandi jika kunci privat dilindungi oleh salah satunya. Kata sandi dilewatkan melalui parameter SecureString yang merupakan tipe khusus yang memastikan bahwa ketika objek tidak lagi digunakan, memori yang ditempati akan ditulis ulang sehingga kata sandi tidak dapat dibaca oleh proses lain di mesin. String aman dan bentuk lain dari data yang dilindungi akan dibahas di bagian selanjutnya.

Karena X509Certificate2 berasal dari X509Certificate, artinya Anda dapat memanggil metode statis CreateFromeCertFile dan CreateFromSignedFile melalui kelas X509Certificate2. Namun, metode ini mengembalikan objek X509Certificate dan Anda tidak dapat menurunkan ini ke objek X509Certificate2. Kelas X509Certificate telah ditingkatkan dalam versi 3.0 / 2.0: ini menyediakan properti untuk mengakses beberapa bidang X509; ini menyediakan metode Impor dan Ekspor untuk menginisialisasi objek dari array byte atau menghasilkan array byte dari sertifikat dan memiliki konstruktor yang akan membuat objek dari file (ASN.1 DER) dan dari array byte. Menariknya, kelas X509Certificate2 memiliki konstruktor yang dapat membuat objek X509Certificate2 dari objek X509Certificate.

Begitu Banyak Goblin
sumber
6

Untuk mengonversi sertifikat X.509 dari "X509Certificate" menjadi "X509Certificate2", coba sesuatu seperti ini:

X509Certificate  X509  = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
ftexperts
sumber
2

Bagi mereka yang ingin membaca sertifikat dan menggunakan ini untuk mengotentikasi, cukup membuat X509Certificate2 dan meneruskan X509Certificate di konstruktornya.

Untuk rakitan bertanda tangan (exe), kodenya adalah kode seperti ini, dan saya menghilangkan validasi kesalahan untuk kesederhanaan.

Module m = Assembly.GetEntryAssembly().GetModules()[0];
using (var cert = m.GetSignerCertificate())
using (var cert2 = new X509Certificate2(cert))
{
   var _clientHandler = new HttpClientHandler();
   _clientHandler.ClientCertificates.Add(cert2);
   _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
   var myModel = new Dictionary<string, string>
   {
       { "property1","value" },
       { "property2","value" },
   };
   using (var content = new FormUrlEncodedContent(myModel))
   using (var _client = new HttpClient(_clientHandler))
   using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result)
   {
       response.EnsureSuccessStatusCode();
       string jsonString = response.Content.ReadAsStringAsync().Result;
       var json = new Newtonsoft.Json.JsonSerializer();
       var myClass = JsonConvert.DeserializeObject<MyClass>(json);
    }
}

Jelas Anda kelas tidak disebut MyClass tetapi beberapa objek bisnis yang Anda harapkan dari layanan web.

Anda dapat mengirim kelas ke tindakan Anda dengan mengirimkan properti & nilai yang Anda perlukan untuk diisi. Sekarang Anda dapat memastikan bahwa permintaan yang Anda terima berasal dari klien seluler atau windows yang valid dengan membaca sertifikat permintaan seperti:

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {           
       X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate;
       if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber))
       {
            Response.StatusCode = 404;
            return null;
       }
       //your code
   }

}

Yang tersisa adalah menyetel server web Anda untuk menerima sertifikat klien ... Anda dapat membaca semua tentang properti yang berasal dari format baru dan Anda telah mengamankan layanan web publik Anda, sesuatu yang paling gagal dilakukan karena hanya diberi otorisasi saja tidak cukup baik lagi (jika pernah)

Walter Vehoeven
sumber