2010-11-16 240 views
10

我有一些C#4.0代码,它试图将CA(.der编码)证书安装到当前(我的)用户的“受信任的根证书颁发机构”存储中。我的小控制台应用程序对其他商店无声无息地运行,但是对于此商店,会弹出一个GUI弹出窗口“您即将安装来自证书颁发机构的证书...... Windows无法验证该证书是否来自于......您是否想要安装这个证书吗?“证书安装安全警告解决方法?

此消息框是一个问题,因为它的想法是自动部署带有MSI的应用程序,并在正确的位置默认获取正确的证书。有一个模式框会终止自动部署。

这个安装如何在没有部署中断的消息框的情况下完成?

+1

原因的Windows弹出这个问题的是,希望将证书添加到根存储带来了安全隐患,所以必须不要轻易做。我不确定是否有办法避免弹出窗口,但我希望不会!安装一个应用程序不应该被允许损害PC的安全性 - 特别是不会默默地。 – dajames 2010-11-20 14:13:54

+2

@dajames Like Oleg在他的回答中写道:管理员可以在没有弹出窗口的情况下在本地机器可信根存储中安装证书。当你安装一个应用程序时,你通常会给安装程序管理员权限,所以我认为你的方案实际上是可行的。另一个原因,你应该小心哪些安装程序/应用程序,你给你宝贵的管理权限。 – Stefan 2011-09-28 16:53:23

回答

25

它听起来不符合逻辑,但是没有警告,您应该将证书添加到当前用户的根证书存储区,而不是添加到本地计算机的根目录。你可以很容易检验

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

产生安全警告,但

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

没有。

所以,如果你想导入.NET证书,则相应的代码可能是约以下

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

我刚刚在Windows 7机器上试过这个。你需要管理员权限才能工作。我认为有意义的是管理员可以在没有可视提示的情况下为本地机器安装受信任的根证书。 – Stefan 2011-09-28 16:45:27

+0

@Stefan:当然**只有管理员**能够在*本地*机器**中安装**根证书,但特别是在需要有时无声安装证书的情况下。例如,考虑设置。所以我看你写的没什么问题。 – Oleg 2011-09-28 17:11:16

+0

我只是想指出(对于其他人陷入这个答案),只有管理员可以做到这一点,而不仅仅是任何用户。阅读你的答案后,我马上就不清楚了。但否则+1为洞察力和有用的代码示例 – Stefan 2011-09-29 07:38:20