2010-11-16 30 views
10

J'ai du code C# 4.0 qui tente d'installer un certificat CA (encodé .der) dans le magasin "Trusted Root Certification Authorities" pour l'utilisateur actuel (My). Ma petite application de console tourne silencieusement contre d'autres magasins, mais pour ce magasin une fenêtre d'interface graphique surgit "Vous êtes sur le point d'installer un certificat d'une autorité de certification ... Windows ne peut pas valider que le certificat est réellement de ..... vouloir installer ce certificat? "Installation du certificat Installation de l'avertissement de sécurité?

Cette boîte aux lettres est un problème car l'idée est de déployer automatiquement l'application avec un MSI et d'obtenir silencieusement les bons certificats au bon endroit. Avoir une boîte modale va tuer le déploiement automatisé.

Comment cette installation peut-elle être effectuée sans messagebox de rupture de déploiement?

+1

La raison de Windows apparaît que jusqu'à la question est que l'ajout de certificats au magasin racine a des implications de sécurité et ils devraient donc ne pas être fait à la légère. Je ne suis pas sûr s'il y a un moyen d'éviter le popup, mais j'espère que non! L'installation d'une application ne doit pas être autorisée à compromettre la sécurité du PC, surtout si elle n'est pas silencieuse. – dajames

+2

@dajames Comme Oleg l'a écrit dans sa réponse: un administrateur est autorisé à installer des certificats dans le magasin racine de confiance des machines locales sans popup. Et lorsque vous installez une application, vous donnez généralement les droits d'administrateur du programme d'installation, donc je pense que votre scénario est réellement possible. Une autre raison pour laquelle vous devriez faire attention quel installateur/application vous donnez vos droits d'administrateur précieux. – Stefan

Répondre

25

Cela peut sembler non logique, mais pour ne pas avoir d'avertissement, vous devez ajouter le certificat non au magasin de certificats racine de l'utilisateur actuel, mais à la racine de la machine locale à la place. Vous pouvez vérifier facilement que

certmgr.exe -add -c t.cer -s -r currentUser root 

produire l'avertissement de sécurité, mais

certmgr.exe -add -c t.cer -s -r localMachine root 

pas.

Donc, si vous voulez importer un certificat dans .NET, puis le code correspondant pourrait être sur le suivant

using System; 
using System.Security.Cryptography.X509Certificates; 

namespace AddCertToRootStore { 
    class Program { 
     static void Main (string[] args) { 
      X509Store store = new X509Store (StoreName.Root, 
              StoreLocation.LocalMachine); 
      store.Open (OpenFlags.ReadWrite); 
      X509Certificate2Collection collection = new X509Certificate2Collection(); 
      X509Certificate2 cert = new X509Certificate2 (@"C:\Oleg\t.cer"); 
      byte[] encodedCert = cert.GetRawCertData(); 
      Console.WriteLine ("The certificate will be added to the Root..."); 
      store.Add (cert); 
      Console.WriteLine("Verify, that the certificate are added successfully"); 
      Console.ReadKey(); 
      Console.WriteLine ("The certificate will be removed from the Root"); 
      store.Remove (cert); 
      store.Close(); 
     } 
    } 
} 
+0

Je viens d'essayer cela sur ma machine Windows 7. Vous avez besoin de droits d'administrateur pour que cela fonctionne. Je pense qu'il est logique que l'administrateur puisse installer des certificats racine approuvés pour la machine locale sans invite visuelle. – Stefan

+0

@Stefan: Bien sûr ** seul l'administrateur ** est capable d'installer ** les certificats racine dans la * local * machine **, mais surtout l'installation de certificats dans le cas doit parfois être silencieuse. Pensez aux configurations par exemple. Donc je ne vois pas de problème dans ce que tu as écrit. – Oleg

+0

Je voulais juste souligner (pour d'autres personnes qui tombent sur cette réponse) que seul l'administrateur peut le faire, pas n'importe quel utilisateur. Ce n'était pas clair pour moi tout de suite après avoir lu votre réponse. Mais sinon +1 pour l'aperçu et l'exemple de code utile – Stefan