2016-08-26 63 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