อะไรคือความแตกต่างระหว่างทั้งสอง?
อะไรคือความแตกต่างระหว่างทั้งสอง?
คำตอบ:
x509Certificateเป็นที่รู้จักใน .NET v1.0 / 1.1 และ (เปรียบเทียบ) จำกัด ในการทำงานของ สามารถใช้เพื่อรับข้อมูลเกี่ยวกับใบรับรองที่มีอยู่ (วันที่ที่ถูกต้องผู้ออก ฯลฯ ) มันมีวิธีการ / การดำเนินการง่ายๆ (เช่นการอ่านใบรับรองจากดิสก์)
X509Certificate2เป็น subclass ของ x509Certificate กับฟังก์ชันการทำงานเพิ่มเติม
เพื่อความสมบูรณ์นี่คือสำเนาของส่วนที่เกี่ยวข้องของไซต์ที่เชื่อมโยงกับในคำตอบของ @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
ในการแปลงใบรับรอง X.509 จาก "X509Certificate" เป็น "X509Certificate2" ให้ลองทำดังนี้:
X509Certificate X509 = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
สำหรับผู้ที่ต้องการอ่านใบรับรองและใช้สิ่งนี้ในการรับรองความถูกต้องเพียงแค่สร้าง 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
}
}
สิ่งที่เหลือคือการตั้งค่าเว็บเซิร์ฟเวอร์ของคุณให้ยอมรับใบรับรองไคลเอ็นต์ ... คุณสามารถอ่านทั้งหมดเกี่ยวกับคุณสมบัติที่มาจากรูปแบบใหม่และคุณได้รักษาความปลอดภัยบริการเว็บสาธารณะของคุณสิ่งที่ไม่สามารถทำได้มากที่สุดเนื่องจากการได้รับอนุญาตนั้นดีพอ อีกต่อไป (ถ้าเคยเป็น)
X509Certificate2
ยังมีสมาชิกสำหรับคีย์ส่วนตัวซึ่งไม่ได้เป็นส่วนหนึ่งของใบรับรอง แต่สะดวกที่จะเชื่อมโยงกับคลาสที่เป็นตัวแทนของใบรับรอง X.509