سؤال

ما الفرق بين الاثنين؟

هل كانت مفيدة؟

المحلول

ال X509Certificate. تم تقديمه في .NET V1.0 / 1.1 وكان (نسبيا) محدودا في وظائفها. يمكن استخدامه للحصول على معلومات حول شهادة موجودة (تواريخ صالحة، المصدر، إلخ). كان لديها أساليب / عمليات بسيطة (أي قراءة سيرت من القرص).

ال X509Certificate2. هي فرعية من X509Certificate مع وظائف إضافية.

  • إنه يمثل شهادة X509 الفعلية.
  • كان جديدا في .NET Framework V2.0.
  • تمنحك هذه الفئة الوصول إلى خصائص V2 و V3 (معرف مفتاح الأساسي والاستخدام الرئيسي).
  • وهو يدعم تحميل شهادة من متجر الشهادات.

نصائح أخرى

من أجل اكتمال، هنا نسخة من القسم ذي الصلة من الموقع مرتبط ب في إجابة @ Dommer، نظرا لأن الموقع قد لا يعود لأعلى وفقط في ذاكرة التخزين المؤقت لجوجل من يعرف - كم من الوقت:

كان الإصدار 1.1 من الإطار بخلاف القليل من فئة X509Certificate للسماح لك بالتلاعب بالشهادات. في الواقع، أعطى فئة V1.1 X509Certificate الدعم الأساسي فقط: أنها منحت فقط الوصول إلى حقول الإصدار 1 X509 (مثل صالحة من التواريخ والموضوع والمفتاح العام) ولكن ليس الإصدار 2 الحقول (مثل المعرف الرئيسي للسلطة ) ولا الإصدار 3 الحقول (مثل الاستخدام الرئيسي). لم يكن هناك دعم لتحميل شهادة من مخزن الشهادة، ولا يوجد لديه المرافق للوصول إلى قوائم إبطال الشهادة أو قوائم ثقة الشهادة. تحسن Microsoft من خلال مجموعة أدوات تحسين خدمات الويب (WSE) على تمديد فئة الشهادة وتوفير الفصول الدراسية للوصول إلى مخازن الشهادات. يمكن الآن العثور على هذه الفصول في مكتبة .NET 3.0 / 2.0 Framework.

التغيير الكبير الأول هو فئة جديدة تسمى x509certificate2 التي تستمد من x509certificate. تم إهمال طرق الوصول إلى حقول شهادات X509 والآن تحتوي الفئة على خصائص للوصول إلى هذه الحقول. بالإضافة إلى ذلك، إذا كانت الشهادة تحتوي على مفتاح خاص مرتبطا، فإن الفئة تمنح الوصول إلى هذا المفتاح. هناك طرق تسمح لك بتقديم كلمة مرور إذا كان المفتاح الخاص محمي بواسطة واحد. يتم تمرير كلمة المرور من خلال معلمة Securestring التي تعد نوعا خاصا يتأكد من أنه عندما لم يعد الكائن يتم استخدام الذاكرة، فسيتم كتابة ذلك بحيث لا يمكن قراءة كلمة المرور من خلال عملية أخرى على الجهاز. سيتم تغطية سلاسل آمنة وغيرها من أشكال البيانات المحمية في قسم لاحق.

نظرا لأن x509certificate2 مستمد من X509Certificate فهذا يعني أنه يمكنك استدعاء الأساليب الثابتة إنشاء FromsFremecertFile وخلق FOMESIGNEDFile من خلال فئة X509Certificate2. ومع ذلك، فإن هذه الأساليب ترجع كائن X509Certificate ولم تتمكن من أسفل هذا إلى كائن X509Certificate2. تم تحسين فئة X509Certificate في الإصدار 3.0 / 2.0: إنه يوفر خصائص للوصول إلى بعض حقول X509؛ يوفر أساليب الاستيراد والتصدير لتهيئة كائن من صفيف البايت أو إنشاء صفيف بايت من الشهادة ولديه منشئين يقومون بإنشاء كائن من ملف (ASN.1 DER) ومن صفيف بايت. ومن المثير للاهتمام، أن فئة X509Certificate2 لديها منشئ يمكنه إنشاء كائن X509Certificate2 من كائن X509Certificate. لاحظ أنه على الرغم من أن كائن X509Certificate يمكنه فقط إظهار حقول X509V1 فقط، فيمكن إنشاءه من شهادة X509V3 وهكذا إذا قمت بإنشاء كائن X509Certificate2 من كائن X509Certificate، فستتمكن من الوصول إلى حقول X509V3.

لتحويل CERT 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
   }

}

ما تبقى هو تعيين خادم الويب الخاص بك لقبول شهادات العميل ... يمكنك قراءة كل شيء عن الخصائص التي تأتي من التنسيق الجديد وتأمل خدمة الويب الخاصة بك، شيء يفشل أكثر من غيره كما هو أذن فقط غير جيد بما فيه الكفاية بعد الآن (إذا كان من أي وقت مضى)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top