10

Ho un codice C# 4.0 che tenta di installare un certificato CA (con codifica .der) nell'archivio "Autorità di certificazione radice attendibili" per l'utente corrente (My). La mia piccola app per console funziona silenziosamente contro altri negozi, ma per questo negozio appare una finestra della GUI "Stai per installare un certificato da un'autorità di certificazione ... Windows non può validare che il certificato sia in realtà da ..... vuoi installare questo certificato? "Avviso per la sicurezza di installazione del certificato Soluzione alternativa?

Questa finestra di messaggio è un problema perché l'idea è di distribuire automaticamente l'applicazione con un MSI e ottenere silenziosamente i certificati corretti nel posto giusto. Avere una casella modale ucciderà la distribuzione automatica.

Come è possibile eseguire l'installazione senza una finestra di dialogo per la distribuzione?

+1

La ragione di Windows si apre quella domanda up è che l'aggiunta di certificati all'archivio principale ha implicazioni di sicurezza, e così dovrebbe non essere fatto alla leggera Non sono sicuro se c'è un modo per evitare il popup, ma spero di no! L'installazione di un'applicazione dovrebbe ** non ** essere in grado di compromettere la sicurezza del PC, specialmente non in modo silenzioso. – dajames

+2

@dajames Come Oleg ha scritto nella sua risposta: un amministratore può installare i certificati nell'archivio root attendibile delle macchine locali senza popup. E quando installi un'applicazione di solito dai diritti di amministratore, quindi penso che il tuo scenario sia effettivamente possibile. Un altro motivo per cui dovresti fare attenzione a quale programma di installazione/applicazione fornisci i tuoi preziosi diritti di amministratore. – Stefan

risposta

25

Può sembrare non logico, ma per non avere avvertenze è necessario aggiungere il certificato non all'archivio dei certificati Root dell'utente corrente, ma al Root della macchina locale. Si può facilmente verificare che

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

producono l'avviso di protezione, ma

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

.

Quindi, se volete importare un certificato nel .NET poi il codice corrispondente potrebbe essere di circa seguente

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

Ho appena provato questo sul mio Windows 7 Machine. Hai bisogno dei diritti di amministratore per farlo funzionare. Penso che abbia senso che l'amministratore possa installare certificati radice affidabili per la macchina locale senza un prompt visivo. – Stefan

+0

@Stefan: Ovviamente ** solo l'amministratore ** è in grado di installare i certificati di root ** nella macchina * local * **, ma in particolare l'installazione di certificati nel caso in cui sia necessario essere a volte silenziosa. Pensa alle configurazioni, per esempio. Quindi non vedo alcun problema in quello che hai scritto. – Oleg

+0

Volevo solo far notare (per altre persone che incappano in questa risposta) che solo l'amministratore può farlo, non solo qualsiasi utente. Non è stato chiaro per me subito dopo aver letto la tua risposta. Ma altrimenti +1 per l'intuizione e l'utile codice di esempio – Stefan