2013-03-01 89 views
1

在我的代碼枚舉所有本地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返回證書商店名稱,但我找不到具有該名稱的商店中的任何證書?

回答

3

商店名稱和商店位置有區別。

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

這是什麼X509Store構造的樣子,只是需要一個StoreLocation,你的第二個例子是調用:

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

這是調用一個同時店名一個位置constructor

你的第一個例子:

var store = new X509Store("MY"); 

在打開MY商店的CurrentUser,而不是本地計算機。所以你正在尋找存在錯誤的。切換到使用同時使用名稱和位置的構造函數。

0

該方法將得到證書,爲您提供:

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; 
} 
+0

大,但我不知道證書主題。 – sharptooth 2013-03-01 10:55:26

相關問題