2016-08-26 124 views
1

我使用的X509Store在C#中DOTNET的遍历证书存储。但是,我不清楚证书位置和证书存储区之间的区别。例如,位置是LocalUser和LocalMachine。商店的例子是我的(个人)和根。 LocalUser上的个人商店与LocalUser上的个人商店之间有什么区别?在LocalMachine上拥有个人商店意味着什么?X509Store位置与商店?

+0

假设机器是特殊用户。 –

回答

1

个人商店LOCALMACHINE包含计算机证书。驻留在此类商店中的证书的示例是IIS使用的用于保护HTTP流量的SSL证书。机器上只有一个这样的商店。

个人商店LocalUser包含用户证书。此类证书的一个示例是用于对电子邮件进行签名的S/MIME证书。每个用户都有他/她自己的这种类型的商店。

+0

感谢您的指点。我正在将Root商店与LocalMachine混淆。那么Root LocalMachine Store和Root Personal Store之间有什么区别? –

+0

查看其他答案。它谈到了这一点。 –

3

有几个旨意店(在括号中的斜体大胆,UI显示名称C#名):

  • 个人):寻找一个叶/终端实体的证书,这个时商店通常被搜索到。这通常是具有相关私钥的证书的唯一商店。
    • 如果您在使用客户端身份验证证书,IE会选择从我的店候选人证书浏览到一个网站。 (正向参考:这个位置是CurrentUser)
    • 当从GUI配置IIS它会显示在我的存储证书。 (正向参考:这个位置是LOCALMACHINE)
  • 受信任的根证书颁发机构):在做一个链接,信任决策,如TLS,如果链的另一端在这家商店代表,那么原始证书是可信的。
    • 除了证书明确这家店它暴露在AuthRoot虚拟视图。
  • AuthRoot第三方根证书颁发机构):当注册一个额外的受信任的根在第三聚会用品商店你“应该”去做,因为...的原因?虽然LocalMachine似乎工作正常,CurrentUser之一seems to mostly be for show
  • CertificateAuthority中级证书颁发机构,对底层系统称为“CA”):这是已知中间证书的存储库。在进行链式构建时,系统将在此查找父级,然后在Root中查找,然后通过Internet查找。如果链是可信的,那么链中间的证书可以缓存在这里供将来查找。
  • 不允许不受信任的证书):如果在此商店中找到证书链的一部分,则该链条被视为不可信。
  • 地址簿其他人):您知道的证书集合。是的,关于那个具体。在尝试匹配对等证书时,它会被某些程序/库搜索到。例如,在SignedXml中查找发行者和序列号通知。

有几个更标准的,你可以read about them at TechNet。您也可以使用X509Store(string, StoreLocation)过载创建自己的证书存储。 (这对于管理应用程序有时很有用,但是当您在自定义商店中拥有私钥时,证书管理器UI会有点困惑;它只会在我的商店中预期它们)。

这就是StoreName。 StoreLocation可能更好地被认为是“店主”。标准用户可以决定他们信任某些私人CA颁发的证书,以便他们可以将其添加到他们的Root商店。由于它的它们的存储它不会影响系统上的任何其他用户。该系统本身也拥有商店。例如,计算机的TLS证书确实属于“计算机”,并且多个管理员可能参与管理它。由于搜索朋友的资料非常不寻常,StoreLocation归结为“我,作为用户”(CurrentUser)或“此计算机”(LocalMachine),供其使用的商店。

事情现在变得有些模糊:在Windows上,几乎每个CurrentUser存储(具有My store的显着例外)都向LocalMachine等效存储公开视图。因此,当您枚举CurrentUser \ Root中的证书时,您将得到这两个明确添加到CurrentUser \ Root的证书以及显式添加到LocalMachine \ Root的证书。这可能会导致混淆,因为枚举时可以看到证书,请将其作为参数调用Remove,并且在枚举时仍然存在。

根据我的经验,大多数与cert商店的互动都在我的商店。在这一点决策树归结为这样的事情:

  • 我是一个专门的用户帐户的服务?
    • new X509Store(StoreName.My, StoreLocation.CurrentUser)
  • 上午我服务没有一个专用的用户帐户?
    • new X509Store(StoreName.My, StoreLocation.LocalMachine)
  • 否则
    • new X509Store(StoreName.My, StoreLocation.CurrentUser)

但是,这是一个很大的推广。

+0

感谢您的详细解释。我注意到了CurrentUser \ Root和LocalMachine \ Root之间的重复。你是说如果服务登录是LSA,那么使用LocalMachine \ My,但是如果它使用特定的登录,那么使用CurrentUser \ My? –

+0

我不是说你“应该”,只是这是我见过的正常模式。对于共享帐户服务(LocalSystem,LocalService,NetworkService),管理员似乎发现使用证书管理器UI更容易操作系统证书。在特定登录中运行服务的好处之一是权限/数据隔离,这意味着您希望使用该登录的证书存储区。 (就像你想要做的事情的细节一样,有很多东西是“除了”和“除非”)的无限链。 – bartonjs