Comment importer par programmation un fichier pfx avec une chaîne de certificats dans le magasin de certificats?
Je suis en train de programmation pour importer un certificat X509 (pfx /PKCS#12) dans ma machine locale du magasin de certificats. Ce certificat a une chaîne de certificats, le chemin d'accès de certification ressemble à quelque chose comme ceci:
- Certificat racine CA
- Certificat d'organisme de CA
- Organisation 2 certificat CA
- Mon certificat
- Organisation 2 certificat CA
- Certificat d'organisme de CA
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 n'importer le certificat, mais il semble ignorer la chaîne. Si je vérifie le certificat dans le magasin, le chemin d'accès de certification ne montre que:
- Mon certificat
Cependant lorsque j'importe le fichier pfx manuellement, il affiche le chemin d'accès complet.
Suis-je sauter une étape ici, ou alors j'ai loupé un certain nombre de paramètres? Quelqu'un peut-il faire la lumière sur cette?
- Un PFX est généralement confondu avec le fichier PKCS#12, Dans votre cas, vous voulez juste une chaîne de certificat, que vous pouvez facilement le faire avec PEM fichiers. Mais ... avez-vous votre propre fichier de clé privée? dans ce cas, vous ne voulez PKCS#12
- Il est en fait un fichier PKCS#12 certificat. Ce n'est pas comme j'ai des choix dans cette.
- Dans ce cas, vous voulez la lire ce sujet pkcs#12 Vous avez un fichier p12 qui contient des objets x509.
- Est-il possible d'utiliser cette magasin le magasin pour valider les certificats sur un appel SOAP??
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure d'effectuer une itération sur les certs dans votre PFX (et l'importation de chacun dans le cert magasin de votre choix) en ouvrant le fichier PFX comme un X509Certificate2Collection objet.
Voici les docs sur X509Certificate2Collection:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx
MSDN fournit un exemple de code dans cet docs page sur la façon d'inspecter chaque cert dans la collection.
Une fois que vous connaissez les systèmes CNs/Émetteurs/d'autres infos sur chaque cert il devrait être clair de magasin de certificats de chacun doit être ajouté. Pour cela, vous pouvez utiliser le X509Store classe et la StoreName énumération pour spécifier le magasin que vous souhaitez ouvrir/ajouter à:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx
Voir aussi ma réponse à une semblable question:
Comment faire pour récupérer les certificats à partir d'un fichier pfx avec c#?
Comme mentionné dans l'un des derniers commentaires sur cette réponse, lorsque vous essayez d'importer un cert pour l'utilisateur actuel du magasin Racine ("StoreName.La racine" et "StoreLocation.CurrentUser" comme le nom de l'endroit), vous obtiendrez une fenêtre de dialogue vous demandant de confirmer.
Pour le résoudre j'ai juste ajouté un peu de MS UI Automation code pour mon cert méthode d'importation, cliquez sur OK à l'invite.
Ou, comme l'auteur du commentaire "CodeWarrior", dit à l'autre AFIN de répondre à un commentaire, pour éviter la boîte de dialogue contextuelle, vous pouvez essayer de mettre la racine cert dans le LocalMachine magasin au lieu de CurrentUser.
Exemple de code:
Référence pour l'avenir, j'ai découvert une autre manière de faire, à l'aide de la X509Chain objet:
Pour quelqu'un qui veut "le magasin" code solution générique
C'est ce que j'ai créé à l'aide de VB et donc ne devrait pas être difficile de port en C#. J'ai utilisé le ci-dessus affiche pour me faire et je suis un total NooB à ce.
Un X. 509 certificat ne contient qu'une chaîne qui la relie à la racine de certificat (y compris les autorités intermédiaires), mais ces certificats ne sont pas contenues dans le certificat. Cette chaîne est utilisée lorsqu'un certificat de fin (qui n'est pas auto-signé) est validée, elle doit mener à un certificat racine de confiance. Plus précisément la clé publique de chaque CA est utilisé pour décoder et vérifier le hachage pour un certificat émis. Ce processus est répété jusqu'à ce que le certificat racine est atteint. Après l'ensemble de la chaîne est vérifié, si le certificat racine de confiance du certificat de fin est aussi digne de confiance. Bien entendu, le processus comprend d'autres validations de trop (comme la date de début, date de fin, liste de révocation de certificats, par exemple), mais j'ai détaillé uniquement la partie relative à l'utilisation de la chaîne.
Si vous avez correctement importés "Mon certificat" en collaboration avec la chaîne de "certificat Root CA" - cette chaîne est codé en "Mon certificat" et vous pouvez le vérifier en consultant ses propriétés, mais cette chaîne est uniquement un lien et il ne contient pas de "certificat Root CA", "certificat d'Organisme de certification" et "Organisation 2 certificat CA" certificats.
J'espère que cela résout votre problème, mais si ça ne marche pas, pourriez-vous être plus précis sur ce que vous voulez accomplir?