Comment importer par programme un pfx avec une chaîne de certificates dans le magasin de certificates?

J’essaie d’importer par programme un certificate X509 (pfx / PKCS # 12) dans le magasin de certificates de mon ordinateur local. Ce certificate particulier a une chaîne de certificates, le chemin de certificateion ressemble à ceci:

  • Certificat racine CA
    • Certificat d’organisation CA
      • Organisme 2 certificate CA
        • Mon certificate

Le code que j’utilise ressemble à ceci:

cert = new X509Certificate2(pathToCert, password); if (cert != null) { var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); if (!store.Certificates.Contains(cert)) { store.Add(cert); } } 

Ce code importe le certificate, mais il semble ignorer la chaîne. Si je vérifie le certificate dans le magasin, le chemin de certificateion indique uniquement:

  • Mon certificate

Cependant, lorsque j’importe le pfx manuellement, il affiche le chemin complet. Est-ce que je saute une étape ici ou est-ce qu’il me manque un paramètre? Quelqu’un peut-il nous éclairer à ce sujet?

Vous devriez pouvoir parcourir les certificates de votre PFX (et les importer dans le magasin de certificates de votre choix) en ouvrant le fichier PFX en tant qu’object X509Certificate2Collection.

Voici la documentation sur X509Certificate2Collection:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificatees.x509certificatee2collection.aspx

MSDN fournit un exemple de code dans cette page de documentation sur la façon d’inspecter chaque certificate de la collection.

Une fois que vous connaissez les CN, les émetteurs ou d’autres informations sur chaque certificate, vous devez indiquer clairement dans quel magasin de certificates chacun doit être ajouté. Pour cela, vous pouvez utiliser la classe X509Store et l’énumération StoreName pour spécifier le magasin dans lequel vous souhaitez ouvrir / append:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificatees.x509store.aspx

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificatees.storename.aspx

Voir aussi ma réponse à une question SO similaire:

Comment récupérer des certificates d’un fichier pfx avec c #?

Comme mentionné dans l’un des derniers commentaires sur cette réponse, lorsque vous essayez d’importer un certificate dans le magasin racine de l’utilisateur actuel (“StoreName.Root” et “StoreLocation.CurrentUser” en tant que nom / emplacement), une boîte de dialog contextuelle vous demandant vous à confirmer.

Pour résoudre ce problème, je viens d’append un petit code MS UI Automation à ma méthode d’importation de certificate, en cliquant sur OK à l’invite.

Ou, comme le commentateur “CodeWarrior” l’indique dans le commentaire de l’autre réponse SO, pour éviter la boîte de dialog contextuelle, vous pouvez essayer de placer le certificate racine dans le magasin LocalMachine au lieu de CurrentUser.

Exemple de code:

 ssortingng certPath = ; ssortingng certPass = ; // Create a collection object and populate it using the PFX file X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet); foreach (X509Certificate2 cert in collection) { Console.WriteLine("Subject is: '{0}'", cert.Subject); Console.WriteLine("Issuer is: '{0}'", cert.Issuer); // Import the certificatee into an X509Store object } 

Pour référence future, j’ai découvert une autre manière de procéder, en utilisant l’object X509Chain:

 var cert = new X509Certificate2(pathToCert, password); X509Chain chain = new X509Chain(); chain.Build(cert); for (int i = 0; i < chain.ChainElements.Count; i++) { //add to the appropriate store } 

Pour tous ceux qui veulent “au magasin approprié” code solution générique

C’est ce que j’ai créé à l’aide de VB, ce qui ne devrait donc pas être trop difficile à porter en C #. J’ai utilisé les messages ci-dessus pour me lancer et je suis un NooB total à ce sujet.

  Dim certPath = "C:\Users\08353153\Documents\Visual Studio 2015\Projects\WindowsApplication2\WindowsApplication2\bin\Debug\8870-thebigchess.pfx" Dim certPass = "eduSTAR.NET" Dim Collection As New X509Certificate2Collection Collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet) Dim certOne As X509Certificate2 = Collection(0) Dim certTwo As X509Certificate2 = Collection(2) Dim certThree As X509Certificate2 = Collection(1) Dim personal As New X509Store(StoreName.My, StoreLocation.LocalMachine) personal.Open(OpenFlags.ReadWrite) personal.Add(certOne) personal.Close() Dim trust As New X509Store(StoreName.Root, StoreLocation.LocalMachine) trust.Open(OpenFlags.ReadWrite) trust.Add(certTwo) trust.Close() Dim intermed As New X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine) intermed.Open(OpenFlags.ReadWrite) intermed.Add(certThree) intermed.Close() 

Un certificate X.509 contient uniquement une chaîne qui le lie au certificate racine (y compris les autorités intermédiaires), mais ces certificates ne sont pas contenus dans le certificate. Cette chaîne est utilisée lorsqu’un certificate de fin (qui n’est pas auto-signé) est validée. Elle doit conduire à un certificate racine approuvé. Plus précisément, la clé publique de chaque autorité de certificateion est utilisée pour décoder et vérifier le hachage d’un certificate émis. Ce processus est répété jusqu’à ce que le certificate racine soit atteint. Une fois que toute la chaîne est vérifiée, si le certificate racine est approuvé, le certificate de fin l’est également. Bien sûr, le processus inclut également d’autres validations (telles que la date de début, la date de fin, la liste de révocation de certificates, par exemple), mais je n’ai détaillé que la partie liée à l’utilisation de la chaîne.

Vous avez donc correctement importé “Mon certificate” avec la chaîne dans “Certificat racine” – cette chaîne est codée dans “Mon certificate” et vous pouvez le confirmer en affichant ses propriétés, mais cette chaîne n’est qu’un lien contient l’un des certificates “CA de certificate racine”, “CA de certificate d’organisation” et “CA de certificate d’organisation 2”.

J’espère que cela résoudra votre problème, mais si ce n’est pas le cas, pourriez-vous être plus précis sur ce que vous essayez d’accomplir?