อะไรคือความแตกต่างระหว่าง X509Certificate2 และ X509Certificate ใน. NET


คำตอบ:


106

x509Certificateเป็นที่รู้จักใน .NET v1.0 / 1.1 และ (เปรียบเทียบ) จำกัด ในการทำงานของ สามารถใช้เพื่อรับข้อมูลเกี่ยวกับใบรับรองที่มีอยู่ (วันที่ที่ถูกต้องผู้ออก ฯลฯ ) มันมีวิธีการ / การดำเนินการง่ายๆ (เช่นการอ่านใบรับรองจากดิสก์)

X509Certificate2เป็น subclass ของ x509Certificate กับฟังก์ชันการทำงานเพิ่มเติม

  • แสดงถึงใบรับรอง X509 จริง
  • เป็นสิ่งใหม่ใน. NET Framework v2.0
  • คลาสนี้ให้คุณเข้าถึงคุณสมบัติ V2 และ V3 ทั้งหมด (ตัวระบุคีย์สิทธิ์และการใช้คีย์)
  • รองรับการโหลดใบรับรองจากที่เก็บใบรับรอง

12
X509Certificate2ยังมีสมาชิกสำหรับคีย์ส่วนตัวซึ่งไม่ได้เป็นส่วนหนึ่งของใบรับรอง แต่สะดวกที่จะเชื่อมโยงกับคลาสที่เป็นตัวแทนของใบรับรอง X.509
Bruno

21

เพื่อความสมบูรณ์นี่คือสำเนาของส่วนที่เกี่ยวข้องของไซต์ที่เชื่อมโยงกับในคำตอบของ @dommer เนื่องจากไซต์อาจไม่สามารถใช้งานได้อีกต่อไปและจะอยู่ในแคชของ Google เท่านั้นสำหรับผู้ที่รู้ระยะเวลา:

เวอร์ชัน 1.1 ของเฟรมเวิร์กมีคลาสอื่นนอกเหนือจากคลาส X509Certificate เพียงเล็กน้อยเพื่อให้คุณจัดการกับใบรับรองได้ ในความเป็นจริงคลาส v1.1 X509Certificate ให้การสนับสนุนขั้นพื้นฐานเท่านั้นโดยให้การเข้าถึงฟิลด์ X509 เวอร์ชัน 1 เท่านั้น (เช่นฟิลด์จากและใช้ได้ถึงวันที่หัวเรื่องและคีย์สาธารณะ) แต่ไม่ใช่ฟิลด์เวอร์ชัน 2 (เช่นตัวระบุคีย์สิทธิ์ ) หรือฟิลด์เวอร์ชัน 3 (เช่นการใช้คีย์) ไม่มีการสนับสนุนในการโหลดใบรับรองจากที่เก็บใบรับรองและไม่มีสิ่งอำนวยความสะดวกในการเข้าถึงรายการเพิกถอนใบรับรองหรือรายการที่เชื่อถือของใบรับรอง Microsoft ปรับปรุงเรื่องนี้ด้วยชุดเครื่องมือ Web Services Enhancement (WSE) ที่ขยายคลาสใบรับรองและจัดเตรียมคลาสเพื่อเข้าถึงที่เก็บใบรับรอง ขณะนี้คลาสเหล่านี้สามารถพบได้ในไลบรารีกรอบงาน. NET 3.0 / 2.0

การเปลี่ยนแปลงครั้งใหญ่ครั้งแรกคือคลาสใหม่ที่เรียกว่า X509Certificate2 ซึ่งมาจาก X509Certificate วิธีการเข้าถึงฟิลด์ใบรับรอง X509 ได้เลิกใช้แล้วและตอนนี้คลาสมีคุณสมบัติในการเข้าถึงฟิลด์เหล่านั้น นอกจากนี้หากใบรับรองมีคีย์ส่วนตัวที่เกี่ยวข้องคลาสจะให้สิทธิ์เข้าถึงคีย์นี้ มีวิธีการที่อนุญาตให้คุณระบุรหัสผ่านหากคีย์ส่วนตัวได้รับการป้องกัน รหัสผ่านถูกส่งผ่านพารามิเตอร์ SecureString ซึ่งเป็นชนิดพิเศษที่ทำให้แน่ใจว่าเมื่อวัตถุไม่ได้ถูกใช้อีกต่อไปหน่วยความจำที่ครอบครองจะถูกเขียนทับเพื่อไม่ให้กระบวนการอื่นในเครื่องอ่านรหัสผ่านได้ สตริงที่ปลอดภัยและข้อมูลที่มีการป้องกันรูปแบบอื่น ๆ จะกล่าวถึงในส่วนต่อไป

เนื่องจาก X509Certificate2 มาจาก X509Certificate หมายความว่าคุณสามารถเรียกเมธอดแบบคงที่ CreateFromeCertFile และ CreateFromSignedFile ผ่านคลาส X509Certificate2 อย่างไรก็ตามเมธอดเหล่านี้ส่งคืนอ็อบเจ็กต์ X509Certificate และคุณไม่สามารถแคสต์สิ่งนี้ไปยังอ็อบเจ็กต์ X509Certificate2 คลาส X509Certificate ได้รับการปรับปรุงในเวอร์ชัน 3.0 / 2.0: มีคุณสมบัติในการเข้าถึงฟิลด์ X509 บางฟิลด์ มีวิธีการนำเข้าและส่งออกเพื่อเริ่มต้นวัตถุจากอาร์เรย์ไบต์หรือสร้างอาร์เรย์ไบต์จากใบรับรองและมีตัวสร้างที่จะสร้างวัตถุจากไฟล์ (ASN.1 DER) และจากอาร์เรย์ไบต์ ที่น่าสนใจคือคลาส X509Certificate2 มีคอนสตรัคเตอร์ที่สามารถสร้างอ็อบเจกต์ X509Certificate2 จากอ็อบเจ็กต์ X509Certificate


6

ในการแปลงใบรับรอง X.509 จาก "X509Certificate" เป็น "X509Certificate2" ให้ลองทำดังนี้:

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

2

สำหรับผู้ที่ต้องการอ่านใบรับรองและใช้สิ่งนี้ในการรับรองความถูกต้องเพียงแค่สร้าง X509Certificate2 และส่ง X509Certificate ในตัวสร้าง

สำหรับแอสเซมบลีที่ลงนาม (exe) รหัสจะเป็นรหัสเช่นนี้และฉันละเว้นการตรวจสอบข้อผิดพลาดเพื่อความเรียบง่าย

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

เห็นได้ชัดว่าคลาสของคุณไม่ได้เรียกว่า MyClass แต่เป็นวัตถุทางธุรกิจบางอย่างที่คุณคาดหวังจากบริการเว็บ

คุณสามารถส่งคลาสให้กับการกระทำของคุณได้โดยส่งคุณสมบัติและมูลค่าที่คุณต้องการกรอก ตอนนี้คุณสามารถมั่นใจได้ว่าคำขอที่คุณได้รับมาจากไคลเอนต์มือถือหรือ windows ที่ถูกต้องโดยอ่านใบรับรองการร้องขอดังนี้:

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
   }

}

สิ่งที่เหลือคือการตั้งค่าเว็บเซิร์ฟเวอร์ของคุณให้ยอมรับใบรับรองไคลเอ็นต์ ... คุณสามารถอ่านทั้งหมดเกี่ยวกับคุณสมบัติที่มาจากรูปแบบใหม่และคุณได้รักษาความปลอดภัยบริการเว็บสาธารณะของคุณสิ่งที่ไม่สามารถทำได้มากที่สุดเนื่องจากการได้รับอนุญาตนั้นดีพอ อีกต่อไป (ถ้าเคยเป็น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.