X509商店位置与商店?

Nei*_*her 2 .net c# windows certificate x509certificate

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

bar*_*njs 6

有一些专用存储(粗体的 C# 名称,括号斜体的 UI 显示名称):

  • 我的个人):在搜索叶/最终实体证书时,通常会搜索此存储。这通常是唯一拥有带有关联私钥的证书的存储。
    • 如果您浏览到使用客户端身份验证证书的站点,IE 将从“我的商店”中选择候选证书。(前向参考:此位置为 CurrentUser)
    • 从 GUI 配置 IIS 时,它将显示来自我的商店的证书。(前向参考:这个位置是LocalMachine)
  • Root受信任的根证书颁发机构):在进行链式信任决策时,例如在 TLS 中,如果链的另一端在此存储中表示,则原始证书是可信的。
    • 除了此存储中明确显示的证书之外,它还公开了 AuthRoot 上的虚拟视图。
  • AuthRoot第三方根证书颁发机构):在注册额外的受信任根时,您“应该”在 3rd 方商店中进行注册,出于......原因?虽然 LocalMachine 似乎工作正常,但 CurrentUser似乎主要用于 show
  • CertificateAuthority中间证书颁发机构,称为底层系统的“CA”):这是已知中间证书的存储库。在进行链构建时,系统将在此处查找父节点,然后在 Root 中查找,然后可能通过 Internet 查找。如果链是值得信赖的,那么链中间的证书可能会缓存在这里以供将来查找。
  • Disallowed ( Untrusted Certificates ):如果在此存储中找到证书链的一部分,则认为该链是不可信的。
  • 地址簿其他人):您知道的证书集合。是的,关于那个具体的。尝试匹配对等证书时,某些程序/库会搜索它。例如,SignedXml 中的 find-by-issuer-and-serial-number 通知。

还有一些更标准的,您可以在 TechNet 上阅读它们。您还可以使用X509Store(string, StoreLocation)重载创建自己的证书存储。(有时它对管理应用程序很有用,但是当您在自定义存储中拥有私钥时,证书管理器 UI 会有些混乱;它只希望它们在我的存储中)。

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

现在事情变得有些模糊:在 Windows 上,几乎每个 CurrentUser 存储(My 存储除外)都向 LocalMachine 等效存储公开了一个视图。所以,当你枚举CurrentUser \根证书你得到两个明确添加到CurrentUser \根证书,也明确添加到LOCALMACHINE \根证书。这可能会导致混淆,因为您可以在枚举时看到证书,将Remove其作为参数调用,再次枚举时它仍然存在。

根据我的经验,与证书商店的大多数交互都是在我的商店中进行的。在这一点上,决策树归结为这样的:

  • 我是具有专用用户帐户的服务吗?
    • new X509Store(StoreName.My, StoreLocation.CurrentUser)
  • 我是否在没有专用用户帐户的情况下提供服务?
    • new X509Store(StoreName.My, StoreLocation.LocalMachine)
  • 别的
    • new X509Store(StoreName.My, StoreLocation.CurrentUser)

但这是一个很大的概括。