В чем разница между X509Certificate2 и X509Certificate in.NET?


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

4 68

4 ответа:

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

The x509Certificate2 является подклассом x509Certificate с дополнительной функциональностью.

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

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

версия 1.1 фреймворка имела очень мало отличного от Класса X509Certificate, чтобы позволить вам манипулировать сертификаты. В факт, класс v1.1 X509Certificate давал только базовую поддержку: он только дал доступ к полям версии 1 X509 (например действительный от и действительны для дат, темы и открытого ключа) , но не для полей версии 2 (например идентификатор ключа полномочий) или поля версии 3 (например, ключ использование.) Не было поддержки для загрузки сертификата из сертификата магазин, и у него нет средств для доступа к сертификату списки отзыва или списки доверия сертификатов. Microsoft улучшила работу это с помощью инструментария Web Services Enhancement (WSE), расширяющего класс сертификата и предоставление классов для доступа к сертификату хранилище. Эти классы теперь можно найти в библиотеке .NET 3.0/2.0 framework.

первое большое изменение-это новый класс под названием X509Certificate2 который происходит от X509Certificate. Методы для доступа к X509 поля сертификата были устаревшими и теперь класс имеет свойства для доступа к этим полям. Кроме того, если сертификат соответствующий закрытый ключ, то класс дает доступ к этому ключу. Есть методы, которые позволяют ввести пароль, если частное ключ защищен одним из них. Пароль передается через объект SecureString параметр, который является специальным типом, который гарантирует, что когда объект больше не используется память, которую она занимала, будет записана так что пароль не может быть прочитан другим процессом на компьютере. Защищенные строки и другие формы защищенных данных будут покрыты в a последующий раздел.

Так как 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.

чтобы преобразовать сертификат 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
   }

}

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