我使用以下代码从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中的证书。
根据我的理解并根据我所阅读的内容here,指纹和指纹算法未存储在证书上。指纹是整个证书的哈希。
这仅仅是X509Store
中的一个限制,因为它只知道其证书的SHA1哈希值,还是我误解了这里的内容?
答案 0 :(得分:1)
一些信息:指纹不是证书的一部分,但它可以是证书存储上下文属性。在证书存储中安装证书时,CryptHashCertificate
函数用于计算SHA1哈希并将其存储在上下文属性中。因此,当您在商店中枚举证书时,每次都不会计算其指纹,系统可能会在上下文属性中使用已保存的哈希值。
如果没有保存的thumprint,或证书上下文在证书存储之外,则使用CryptHashCertificate
函数即时计算指纹。在证书上下文中,函数默认为SHA1,无法更改此行为。
所以你是正确的X509Store
将始终使用SHA1作为指纹。它不是实际的X509Store
限制,而是底层CryptoAPI库的限制。
P.S。 certutil可能会显示SHA256指纹,但它是特定于certutil的功能。