Вопрос по .net, ssl, certificate, x509certificate – В чем разница между X509Certificate2 и X509Certificate в .NET?

72

Какая разница между двумя?

Ваш Ответ

4   ответа
18

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

Version 1.1 of the framework had very little other than the X509Certificate class to allow you to manipulate certificates. In fact, the v1.1 X509Certificate class gave only basic support: it only gave access to the X509 version 1 fields (like the valid from and valid to dates, subject and public key) but not version 2 fields (like the authority key identifier) nor version 3 fields (like the key usage). There was no support to load a certificate from a certificate store, nor does it have the facilities to access certificate revocation lists or certificate trust lists. Microsoft improved on this with the Web Services Enhancement (WSE) toolkit extending the certificate class and providing classes to access certificate stores. These classes can now be found in the .NET 3.0/2.0 framework library.

The first big change is a new class called X509Certificate2 which derives from X509Certificate. The methods to access the X509 certificate fields have been deprecated and now the class has properties to access those fields. In addition, if the certificate has an associated private key then the class gives access to this key. There are methods that allow you to provide a password if the private key is protected by one. The password is passed through a SecureString parameter which is a special type that makes sure that when the object is no longer being used the memory it occupied will be written over so that the password cannot be read by another process on the machine. Secure strings and other forms of protected data will be covered in a later section.

Since X509Certificate2 derives from X509Certificate it means that you can call the static methods CreateFromeCertFile and CreateFromSignedFile through the X509Certificate2 class. However, these methods return an X509Certificate object and you cannot down cast this to a X509Certificate2 object. The X509Certificate class has been improved in version 3.0/2.0: it provides properties to access some of the X509 fields; it provides Import and Export methods to initialize an object from a byte array or generate a byte array from the certificate and it has constructors that will create an object from a file (ASN.1 DER) and from a byte array. Interestingly, the X509Certificate2 class has a constructor that can create an X509Certificate2 object from an X509Certificate object. Note that although an X509Certificate object can only show the X509v1 fields it can be created from an X509v3 certificate and so if you create an X509Certificate2 object from an X509Certificate object you will be able to access the X509v3 fields.

84

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

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

It represents an actual X509 certificate. It was new in the .NET Framework v2.0. This class gives you access to all the V2 and V3 properties (authority key identifier and key usage). It supports loading a certificate from a certificate store.
X509Certificate2 также имеет член для закрытого ключа, который не является частью самого сертификата, но его удобно связывать с классом, представляющим сертификат X.509.
0

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

Вы можете отправить класс на свое действие, отправив свойство & amp; значение, которое вы требуете заполнены. Теперь вы можете убедиться, что полученный вами запрос поступил от действующего мобильного клиента или клиента 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
   }

}

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

4

ificate2" попробуйте что-то вроде этого:

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

Похожие вопросы