Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我不能按存储名和哈希查找证书吗?_C#_.net_Iis_Certificate - Fatal编程技术网

C# 为什么可以';我不能按存储名和哈希查找证书吗?

C# 为什么可以';我不能按存储名和哈希查找证书吗?,c#,.net,iis,certificate,C#,.net,Iis,Certificate,在我的代码中,我枚举了所有本地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.Certifica

在我的代码中,我枚举了所有本地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
转换为
“我的”
指纹
转换为十六进制表示形式的字节数组

现在,“验证”部分的工作原理如下:

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");

然后,代码生成一个包含两个证书的集合,其中一个证书有右指纹,我可以验证它


为什么
Binding
会返回一个证书存储名称,但我在存储中找不到任何具有该名称的证书?

存储名称和存储位置之间存在差异

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

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

public X509Store(StoreLocation storeLocation) : this("MY", storeLocation)
{
}
这是调用同时具有商店名称和位置的

您的第一个示例:

var store = new X509Store("MY");

正在为而不是本地计算机打开
MY
存储。所以你找错商店了。切换到使用同时具有名称和位置的构造函数。

此方法将为您获取证书:

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

很好,不过我不知道证书的题目。
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;
}