57 votes

Comment puis-je installer un certificat dans le magasin de la machine locale de manière programmatique en utilisant c# ?

J'ai un certificat généré via MakeCert. Je veux utiliser ce certificat pour la sécurité des messages WCF en utilisant PeerTrust. Comment puis-je installer de manière programmatique le certificat dans le magasin de certificats de la machine locale des "personnes de confiance" en utilisant c# ou .NET ?

J'ai un fichier CER, mais je peux aussi créer un PFX.

0 votes

Btw - je connais les détails de Makecert et de la confiance. S'il vous plaît, je cherche juste des suggestions sur l'installation du certificat en utilisant le c# programmatique ou installshield. merci !

0 votes

Une idée de comment faire cela en programme C ? Une API dans Windows ?

62voto

Demi Points 3547

Je crois que c'est correct :

using (X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine)) 
{
   store.Open(OpenFlags.ReadWrite);
   store.Add(cert); //where cert is an X509Certificate object
}

1 votes

Cela installe le certificat avec succès, mais lorsque j'ouvre l'option Manage Private Keys pour la clé privée dans le magasin personnel, il donne l'erreur "aucune clé trouvée pour le certificat".

1 votes

Je suppose que cette réponse est maintenant nulle car X509Store n'est pas jetable.

0 votes

@mit avez-vous trouvé une solution pour "no private key found for this certificate" ?

42voto

Ce qui suit fonctionne bien pour moi :

private static void InstallCertificate(string cerFileName)
{
    X509Certificate2 certificate = new X509Certificate2(cerFileName);
    X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);

    store.Open(OpenFlags.ReadWrite);
    store.Add(certificate);
    store.Close();
}

7voto

user1799563 Points 53

Au lieu d'installer le certificat dans LocalMachine, ce qui nécessite des privilèges élevés, vous pouvez l'ajouter à "CurrentUser" (cela fonctionne pour moi).

X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(cert); //where cert is an X509Certificate object
store.Close();

0 votes

Merci pour cela. C'était préférable pour moi, car il s'agira d'un service auto-hébergé qui sera exécuté (plusieurs instances) au moment de l'exécution. Il n'est pas possible de fournir une invite UAC. Merci encore !

3voto

Dmitry Points 21

J'ai dû utiliser X509KeyStorageFlags. PersistKeySet | X509KeyStorageFlags. MachineKeySet drapeaux à résoudre "Le jeu de clés n'existe pas" l'erreur qui s'est produite ultérieurement lors de la tentative d'utilisation du certificat :

X509Certificate2 certificate = new X509Certificate2(pfxPath, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
     store.Open(OpenFlags.ReadWrite);
     store.Add(certificate);
     store.Close();
}

Grâce à cet article : Clé privée du certificat dans le magasin de certificats non lisible

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X