.NET'te X509Certificate2 ile X509Certificate arasındaki fark nedir?


Yanıtlar:


106

X509Certificate .NET 1.0 tanıtılan / 1.1 ve oldu (nispeten) işlevselliği sınırlıdır. Mevcut bir sertifika hakkında bilgi almak için kullanılabilir (geçerlilik tarihleri, veren kuruluş vb.). Basit yöntemleri / işlemleri vardı (yani diskten sertifika okumak).

X509Certificate2 ek işlevselliği ile X509Certificate bir alt sınıfıdır.

  • Gerçek bir X509 sertifikasını temsil eder.
  • .NET Framework v2.0'da yeniydi.
  • Bu sınıf, tüm V2 ve V3 özelliklerine (yetki anahtarı tanımlayıcısı ve anahtar kullanımı) erişmenizi sağlar.
  • Bir sertifika deposundan sertifika yüklemeyi destekler.

12
X509Certificate2ayrıca, sertifikanın kendisinin bir parçası olmayan, ancak X.509 sertifikasını temsil eden sınıfla ilişkilendirilmesi uygun olan özel anahtar için bir üyeye sahiptir.
Bruno

21

Bütünlük adına, burada @ dommer'ın cevabıyla bağlantılı olan sitenin ilgili bölümünün bir kopyasını burada bulabilirsiniz , çünkü site artık açık olmayabilir ve yalnızca Google'ın kim-bilir-ne kadar süre önbelleğinde olabilir:

Çerçevenin 1.1 Sürümünde, sertifikaları değiştirmenize izin veren X509Certificate sınıfından çok az şey vardı. Aslında, v1.1 X509Certificate sınıfı yalnızca temel destek verdi: yalnızca X509 sürüm 1 alanlarına (geçerli başlangıç ​​ve son tarihler, konu ve genel anahtar gibi) erişim sağladı, ancak sürüm 2 alanlarına (yetki anahtarı tanımlayıcısı gibi ) veya sürüm 3 alanları (anahtar kullanımı gibi). Bir sertifika deposundan sertifika yükleme desteği yoktu ve sertifika iptal listelerine veya sertifika güven listelerine erişme olanaklarına sahip değil. Microsoft, sertifika sınıfını genişleten ve sertifika depolarına erişim için sınıflar sağlayan Web Hizmetleri Geliştirme (WSE) araç seti ile bunu geliştirdi. Bu sınıflar artık .NET 3.0 / 2.0 çerçeve kitaplığında bulunabilir.

İlk büyük değişiklik, X509Certificate'dan türetilen X509Certificate2 adlı yeni bir sınıftır. X509 sertifika alanlarına erişim yöntemleri kullanımdan kaldırıldı ve artık sınıfın bu alanlara erişmek için özellikleri var. Ek olarak, sertifikanın ilişkili bir özel anahtarı varsa, sınıf bu anahtara erişim sağlar. Özel anahtar bir şifre ile korunuyorsa, şifre sağlamanıza izin veren yöntemler vardır. Parola, nesne artık kullanılmadığında kapladığı belleğin üzerine yazılmasını ve böylece parolanın makinedeki başka bir işlem tarafından okunamamasını sağlayan özel bir tür olan SecureString parametresinden geçirilir. Güvenli dizeler ve diğer korunan veri biçimleri daha sonraki bir bölümde ele alınacaktır.

X509Certificate2, X509Certificate 'dan türetildiğinden, bu, X509Certificate2 sınıfı aracılığıyla CreateFromeCertFile ve CreateFromSignedFile statik yöntemlerini çağırabileceğiniz anlamına gelir. Ancak, bu yöntemler bir X509Certificate nesnesi döndürür ve bunu bir X509Certificate2 nesnesine çeviremezsiniz. X509Certificate sınıfı 3.0 / 2.0 sürümünde geliştirilmiştir: X509 alanlarından bazılarına erişmek için özellikler sağlar; bir bayt dizisinden bir nesneyi başlatmak veya sertifikadan bir bayt dizisi oluşturmak için Alma ve Verme yöntemleri sağlar ve bir dosyadan (ASN.1 DER) ve bir bayt dizisinden bir nesne oluşturacak yapıcılara sahiptir. İlginç bir şekilde, X509Certificate2 sınıfının bir X509Certificate nesnesinden bir X509Certificate2 nesnesi oluşturabilen bir yapıcısı vardır.


6

Bir X.509 sertifikasını "X509Certificate" dan "X509Certificate2" ye dönüştürmek için şuna benzer bir şey deneyin:

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

2

Sertifikayı okumak ve kimliğini doğrulamak için bunu kullanmak isteyenler, bir X509Certificate2 oluşturup X509Certificate'ı kurucusunda geçirirler.

İmzalı bir derleme (exe) için kod böyle bir kod olacaktır ve basitlik için hata doğrulamasını atlıyorum.

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

Açıkçası, sınıfa MyClass değil, web hizmetinden bekleyeceğiniz bazı iş nesneleri denir.

Doldurulmasını istediğiniz mülk ve değeri göndererek eyleminize bir sınıf gönderebilirsiniz. Artık, istek sertifikasını aşağıdaki gibi okuyarak, aldığınız isteğin geçerli bir mobil veya Windows istemcisinden geldiğinden emin olabilirsiniz:

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
   }

}

Geriye kalan şey, web sunucunuzu istemci sertifikalarını kabul edecek şekilde ayarlamaktır ... Yeni formattan gelen özellikler hakkında her şeyi okuyabilirsiniz ve genel web hizmetinizi güvence altına almış olursunuz, çoğu kişinin yapamadığı bir şey yetkilendirilmek yeterince iyi değildir artık (eğer öyleyse)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.