2017-04-07 1 views
2

J'ai un fichier (.p12) contenant 3 certificats (chaînés) protégés par mot de passe, que j'ai installés dans mon magasin. J'essaie de les charger dans mon code. La façon dont je les charge à partir du fichier est comme ceci:Chargement de la chaîne de certificats X509Certificate2 du magasin

var clientCert = new X509Certificate2(@"myfile.p12", "mypassword"); 

Comment puis-je obtenir le même résultat en les chargeant à partir du magasin?

J'ai essayé:

var computerCaStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
computerCaStore.Open(OpenFlags.ReadOnly); 
var certificates = computerCaStore.Certificates.OfType<X509Certificate2>().ToLi‌​st(); 
var certFromStore = certificates.Single(c => c.Thumbprint == thumbprintMerchant); 
var newCert = new X509Certificate2(certFromStore.RawData, "mypassword"); 
+0

Si la première ligne est représentative de votre code alors 'clientCert' n'est pas enchaîné à 3 certs, mais seulement le cert qui avait une clé privée. La deuxième ligne n'est pas capable de produire l'erreur que vous avez montrée, donc il y a clairement plus de contexte. Comme, comment vous avez 'certFromStore' en premier lieu. – bartonjs

+0

Lorsque j'importe le même fichier dans le magasin, j'obtiens 3 certificats, mais lorsque je le charge à partir du code, c'est un cert avec une clé privée. Alors, comment puis-je obtenir la même chose du magasin? Voici comment je les charge depuis le magasin: 'var computerCaStore = new X509Store (StoreName.Root, StoreLocation.LocalMachine); computerCaStore.Open (OpenFlags.ReadOnly); \t \t \t \t \t var Certificats = computerCaStore.Certificates.OfType (). ToList(); \t \t \t \t var = clientCertificat1 certificates.Single (c => c.Thumbprint == thumbprintMerchant); ' J'utilise l'empreinte numérique –

+0

S'il vous plaît modifier la question pour le contexte. Votre exemple de code dans le commentaire ne correspond pas à la question, ce qui rend difficile de raisonner sur quoi que ce soit. – bartonjs

Répondre

1

certFromStore devrait être équivalent à clientCert, la dernière ligne est ce que vous briser.

La propriété RawData sur X509Certificate2 renvoie la valeur codée DER pour le certificat, pas les octets de fichier d'origine. Un certificat n'a pas de clé privée, donc la dernière ligne le supprime. Votre question avait déjà mentionné une exception TLS, et c'est parce que votre CERT n'a plus de clé privée.

Si certFromStore.HasPrivateKey est faux, alors tout ce que vous avez fait pour mettre le certificat dans le magasin n'a pas fonctionné comme vous le pensez. Il est assez inhabituel pour un certificat avec une clé privée d'être dans le magasin racine.