В чем разница между X509Certificate2 и X509Certificate в .NET? - PullRequest
82 голосов
/ 25 июля 2009

В чем разница между двумя?

Ответы [ 4 ]

95 голосов
/ 25 июля 2009

Сертификат x509 был представлен в .NET v1.0 / 1.1 и (сравнительно) ограничен в своей функциональности. Его можно использовать для получения информации о существующем сертификате (действительные даты, эмитент и т. Д.). У него были простые методы / операции (например, чтение сертификата с диска).

x509Certificate2 - это подкласс x509Certificate с дополнительными функциями.

  • Представляет собой действительный сертификат X509.
  • Он был новым в .NET Framework v2.0.
  • Этот класс предоставляет вам доступ ко всем свойствам V2 и V3 (идентификатор ключа доступа и использование ключа).
  • Поддерживается загрузка сертификата из хранилища сертификатов.
20 голосов
/ 04 января 2012

Для полноты картины приведу копию соответствующего раздела сайта , связанного с в ответе @ dommer, так как сайт больше не работает и только в кеше Google для тех, кто знает ... как долго:

Версия 1.1 фреймворка имела совсем немного другого, кроме класса X509Certificate, позволяющего вам манипулировать сертификатами. Фактически, класс X509Certificate v1.1 предоставлял только базовую поддержку: он предоставлял доступ только к полям X509 версии 1 (таким как действительный и действительный для дат, субъект и открытый ключ), но не к полям версии 2 (например, идентификатор ключа доступа)) ни поля версии 3 (как использование ключа). Не было поддержки загрузки сертификата из хранилища сертификатов, и при этом у него не было средств для доступа к спискам отзыва сертификатов или спискам доверия сертификатов. Корпорация Майкрософт улучшила это с помощью инструментария 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. Обратите внимание, что хотя объект X509Certificate может отображать только поля X509v1, он может быть создан из сертификата X509v3, поэтому при создании объекта X509Certificate2 из объекта X509Certificate вы сможете получить доступ к полям X509v3.

6 голосов
/ 27 мая 2017

Чтобы преобразовать сертификат X.509 из "X509Certificate" в "X509Certificate2", попробуйте что-то вроде этого:

X509Certificate  X509  = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
1 голос
/ 13 января 2018

Для тех, кто хотел бы прочитать сертификат и использовать его для аутентификации, просто создайте 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
   }

}

Осталось только настроить веб-сервер напринимать клиентские сертификаты ... Вы можете прочитать все о свойствах, которые приходят из нового формата, и вы защитили свой общедоступный веб-сервис, чего больше всего не удается сделать, так как просто авторизация уже недостаточно хороша (если это когда-либо было)

...