2009-07-25 7 views

Répondre

72

Le x509Certificate a été introduit dans .NET v1.0/1.1 et était (limité) dans sa fonctionnalité. 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 cert à 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.
  • Il était nouveau dans .NET Framework v2.0.
  • Cette classe vous donne accès à toutes les propriétés V2 et V3 (identificateur de clé d'autorité et utilisation des clés).
  • Il prend en charge le chargement d'un certificat à partir d'un magasin de certificats.
+6

'X509Certificate2' a également un membre pour la clé privée, qui ne fait pas partie du certificat lui-même, mais il est pratique d'avoir associé avec le représentant de la classe renvoyer le certificat X.509. – Bruno

18

Par souci d'exhaustivité, voici une copie de la section pertinente du site linked to dans la réponse de @ Dommer, puisque le site ne peut plus être et que dans le cache de Google pour qui-sait-combien de temps:

La version 1.1 du cadre avait très peu autre que la classe X509Certificate pour vous permettre de manipuler des certificats. En fait, la classe v1.1 X509Certificate a donné seulement le soutien de base: seulement a donné accès aux champs X509 version 1 (comme le valide de et valide aux dates, sujet et clé publique) mais pas les champs version 2 (comme l'identificateur de clé d'autorité) ni les champs de la version 3 (comme l'utilisation de la clé ). Il n'y avait pas de support pour charger un certificat à partir d'un magasin de certificats , ni d'installations pour accéder au certificat listes de révocation ou listes de confiance de certificat. Microsoft a amélioré le avec la boîte à outils Web Services Enhancement (WSE) en étendant la classe de certificat et en fournissant des classes pour accéder aux magasins de certificats. Ces classes peuvent maintenant être trouvées dans la bibliothèque de framework .NET 3.0/2.0.

Le premier grand changement est une nouvelle classe appelée X509Certificate2 dont dérive de X509Certificate. Les méthodes d'accès aux champs du certificat X509 ont été abandonnées et la classe a maintenant propriétés pour accéder à ces champs. En outre, 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é par un paramètre SecureString qui est un type spécial qui s'assure que lorsque l'objet n'est plus utilisé, la mémoire qu'il a occupée sera écrite de façon à que le mot de passe ne puisse pas être lu par un autre processus sur la machine. Les chaînes sécurisées et d'autres formes de données protégées seront couvertes dans une section ultérieure .

Depuis X509Certificate2 dérive de X509Certificate cela signifie que vous pouvez appeler les méthodes statiques CreateFromeCertFile et CreateFromSignedFile par la classe X509Certificate2.Toutefois, ces méthodes retournent un objet X509Certificate et vous ne pouvez pas descendre le cast à un objet X509Certificate2. La classe X509Certificate a été améliorée dans la version 3.0/2.0: il 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. Notez que même si un objet X509Certificate peut uniquement afficher les champs X509v1, peut être créé à partir d'un certificat X509v3 et si vous créez un objet X509Certificate2 à partir d'un objet X509Certificate, vous pourrez accéder aux champs X509v3 en tant que .

2

Pour convertir un cert X.509 « X509Certificate » à « X509Certificate2 », essayer quelque chose comme ceci:

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

Pour ceux qui voudraient lire le certificat et l'utiliser pour authentifier un serait Il suffit de créer un X509Certificate2 et de passer le X509Certificate dans son constructeur.

Pour un assembly signé (l'exe) le code serait le code comme ceci, et j'omets la validation d'erreur pour la 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); 
    } 
} 

Il est évident que vous êtes la classe n'est pas appelée MyClass, mais un objet d'affaires que vous attendez du service Web.

Vous pouvez envoyer une classe à votre action en envoyant la propriété & valeur que vous avez besoin rempli. Vous pouvez maintenant faire en sorte que la demande que vous avez reçu est d'un client mobile ou Windows valide en lisant le certificat de demande comme ceci:

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 
    } 

}

Ce qui reste est de mettre votre serveur Web pour accepter les certificats clients. .. Vous pouvez lire tout sur les propriétés qui viennent du nouveau format et vous avez sécurisé votre service web public, quelque chose que la plupart ne parviennent pas à faire, car être autorisé ne suffit plus (si jamais)

Questions connexes