Quelle est la différence entre X509Certificate2 et X509Certificate dans .NET?

Réponses:

104

Le certificat x509 été introduit dans .NET v1.0 / 1.1 et était (comparativement) limité dans ses fonctionnalités. Il peut être utilisé pour obtenir des informations sur un certificat existant (dates valides, émetteur, etc.). Il avait des méthodes / opérations simples (c'est-à-dire lire un certificat à partir du disque).

Le x509Certificate2 est une sous-classe de x509Certificate avec des fonctionnalités supplémentaires.

  • Il représente un certificat X509 réel.
  • C'était nouveau dans le .NET Framework v2.0.
  • Cette classe vous donne accès à toutes les propriétés V2 et V3 (identifiant de clé d'autorité et utilisation de la clé).
  • Il prend en charge le chargement d'un certificat à partir d'un magasin de certificats.
p.campbell
la source
12
X509Certificate2a également un membre pour la clé privée, qui ne fait pas partie du certificat lui-même mais qui est pratique à associer à la classe représentant le certificat X.509.
Bruno
21

Par souci d'exhaustivité, voici une copie de la section correspondante du site liée à la réponse de @ dommer, car le site peut ne plus être disponible et uniquement dans le cache de Google pendant on ne sait combien de temps:

La version 1.1 du framework avait très peu d'autre que la classe X509Certificate pour vous permettre de manipuler les certificats. En fait, la classe v1.1 X509Certificate ne donnait qu'un support basique: elle ne donnait accès qu'aux champs X509 version 1 (comme les dates valides de et valides à, sujet et clé publique) mais pas les champs de la version 2 (comme l'identifiant de clé d'autorité ) ni les champs de la version 3 (comme l'utilisation de la clé). Il n'y avait aucune prise en charge pour charger un certificat à partir d'un magasin de certificats, ni les fonctionnalités nécessaires pour accéder aux listes de révocation de certificats ou aux listes de certificats de confiance. Microsoft a amélioré cela avec la boîte à outils Web Services Enhancement (WSE) étendant la classe de certificat et fournissant des classes pour accéder aux magasins de certificats. Ces classes se trouvent désormais dans la bibliothèque de framework .NET 3.0 / 2.0.

Le premier grand changement est une nouvelle classe appelée X509Certificate2 qui dérive de X509Certificate. Les méthodes pour accéder aux champs du certificat X509 sont obsolètes et la classe possède désormais des propriétés pour accéder à ces champs. De plus, si le certificat a une clé privée associée, la classe donne accès à cette clé. Il existe des méthodes qui vous permettent de fournir un mot de passe si la clé privée est protégée par un. Le mot de passe est passé via un paramètre SecureString qui est un type spécial qui garantit que lorsque l'objet n'est plus utilisé, la mémoire qu'il occupait sera écrasée afin que le mot de passe ne puisse pas être lu par un autre processus sur la machine. Les chaînes sécurisées et autres formes de données protégées seront abordées dans une section ultérieure.

Étant donné que X509Certificate2 dérive de X509Certificate, cela signifie que vous pouvez appeler les méthodes statiques CreateFromeCertFile et CreateFromSignedFile via la classe X509Certificate2. Cependant, ces méthodes renvoient un objet X509Certificate et vous ne pouvez pas effectuer de conversion descendante en un objet X509Certificate2. La classe X509Certificate a été améliorée dans la version 3.0 / 2.0: elle fournit des propriétés pour accéder à certains des champs X509; il fournit des méthodes d'importation et d'exportation pour initialiser un objet à partir d'un tableau d'octets ou générer un tableau d'octets à partir du certificat et il a des constructeurs qui créeront un objet à partir d'un fichier (ASN.1 DER) et d'un tableau d'octets. Fait intéressant, la classe X509Certificate2 a un constructeur qui peut créer un objet X509Certificate2 à partir d'un objet X509Certificate.

Tant de gobelins
la source
6

Pour convertir un certificat X.509 de «X509Certificate» en «X509Certificate2», essayez quelque chose comme ceci:

X509Certificate  X509  = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
ftexperts
la source
2

Pour ceux qui souhaitent lire le certificat et l'utiliser pour s'authentifier, il suffit de créer un X509Certificate2 et de transmettre le X509Certificate dans son constructeur.

Pour un assembly signé (l'exe), le code serait un code comme celui-ci, et j'omets la validation des erreurs pour plus de simplicité.

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);
    }
}

Évidemment, votre classe ne s'appelle pas MyClass mais un objet métier que vous attendez du service Web.

Vous pouvez envoyer une classe à votre action en envoyant la propriété et la valeur dont vous avez besoin. Vous pouvez maintenant vous assurer que la demande que vous avez reçue provient d'un client mobile ou Windows valide en lisant le certificat de demande comme suit:

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
   }

}

Il ne vous reste plus qu'à configurer votre serveur Web pour accepter les certificats clients ... Vous pouvez tout lire sur les propriétés qui proviennent du nouveau format et vous avez sécurisé votre service Web public, ce que la plupart ne parvient pas à faire car le simple fait d'être autorisé n'est pas suffisant plus (si jamais ça l'a été)

Walter Vehoeven
la source