簡體   English   中英

為什么我不能通過商店名稱和哈希找到證書?

[英]Why can't I find the certificate by store name and hash?

在我的代碼中,我枚舉所有本地IIS站點,並為每個站點嘗試驗證端口443的證書。

using( var sm = new ServerManager() ) {
  foreach( var site in sm.Sites ) {
    foreach( var binding in site.Bindings ) {
       if( binding.EndPoint.Port == 443 ) {
          var thumbprint = binding.CertificateHash;
          var storeName = binding.CertificateStoreName;
          //validation here...
       }
    }
  }
}

此代碼yeilds的storeName"MY"thumbprint被一些字節數組我轉換成十六進制表示。

現在“驗證”部分的工作原理如下:

var store = new X509Store("MY");
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates;
//find and validate my cert
store.Close();

這段代碼產生一個空集合。 但如果我改變

var store = new X509Store("MY");

var store = new X509Store(StoreLocation.LocalMachine);

然后代碼產生一個帶有兩個證書的集合,其中一個具有正確的指紋,我可以驗證它。

為什么Binding返回證書商店名稱,但我在商店中找不到具有該名稱的任何證書?

商店名稱和商店位置之間存在差異。

IIS的所有證書都存儲在本地計算機位置,而不是特定用戶帳戶的位置。

這就是X509Store的構造函數,它只是一個StoreLocation ,你的第二個例子是調用它:

public X509Store(StoreLocation storeLocation) : this("MY", storeLocation)
{
}

這是調用同時獲取商店名稱位置的構造函數

你的第一個例子:

var store = new X509Store("MY");

是打開CurrentUserMY商店,而不是本地機器。 所以你在找錯了商店。 切換到使用同時包含名稱和位置的構造函數。

此方法將為您獲取證書:

private X509Certificate2 GetServiceCertificate(String certificateSubjectName, StoreName storeName = StoreName.My, StoreLocation storeLocation = StoreLocation.CurrentUser)
{
    X509Store certificateStore = new X509Store(storeName, storeLocation);
    foreach (X509Certificate2 certificate in certificateStore.Certificates)
    {
        if (certificate.SubjectName.Name == certificateSubjectName)
        {
            return certificate;
        }
    }
    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM