使用SHA256哈希从X509Store加载证书

时间:2018-03-12 19:16:10

标签: .net x509certificate x509

我使用以下代码从X509Store

中检索证书
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);            
X509Certificate2Collection certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, configuration.CertificateThumbprint, false);
if (certificateCollection == null || certificateCollection.Count == 0)
{
    throw new Exception("Certificate not installed in the store");
}

certificate = certificateCollection[0];

当我使用cert的SHA1哈希时,这非常有效。当我尝试通过SHA256哈希加载它时,它不起作用。这是MMC中的证书。

cert as seen in MMC

根据我的理解并根据我所阅读的内容here,指纹和指纹算法未存储在证书上。指纹是整个证书的哈希。 这仅仅是X509Store中的一个限制,因为它只知道其证书的SHA1哈希值,还是我误解了这里的内容?

1 个答案:

答案 0 :(得分:1)

一些信息:指纹不是证书的一部分,但它可以是证书存储上下文属性。在证书存储中安装证书时,CryptHashCertificate函数用于计算SHA1哈希并将其存储在上下文属性中。因此,当您在商店中枚举证书时,每次都不会计算其指纹,系统可能会在上下文属性中使用已保存的哈希值。

如果没有保存的thumprint,或证书上下文在证书存储之外,则使用CryptHashCertificate函数即时计算指纹。在证书上下文中,函数默认为SHA1,无法更改此行为。

所以你是正确的X509Store将始终使用SHA1作为指纹。它不是实际的X509Store限制,而是底层CryptoAPI库的限制。

P.S。 certutil可能会显示SHA256指纹,但它是特定于certutil的功能。