【问题标题】:Why can't I find the certificate by store name and hash?为什么我无法通过商店名称和哈希找到证书?
【发布时间】:2013-02-15 19:05:37
【问题描述】:

在我的代码中,我列举了所有本地 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...
       }
    }
  }
}

此代码生成 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 返回一个证书存储名称,但我在存储中找不到任何具有该名称的证书?

【问题讨论】:

    标签: c# .net iis certificate


    【解决方案1】:

    商店名称和商店位置之间是有区别的。

    IIS 的所有证书都存储在本地计算机位置,而不是针对特定用户帐户的证书。

    这是X509Store 的构造函数的样子,它只需要一个StoreLocation,您的第二个示例正在调用:

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

    调用constructor,它需要一个商店名称​​和一个位置。

    你的第一个例子:

    var store = new X509Store("MY");
    

    正在为CurrentUser 而不是本地计算机打开MY 存储。因此,您正在寻找错误 商店。切换到使用同时接受名称和位置的构造函数。

    【讨论】:

      【解决方案2】:

      此方法将为您获取证书:

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

      【讨论】:

      • 很好,只是我不知道证书主题。
      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2020-05-23
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多