2013-03-01 85 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

相关问题