如何在 C++ 中检索证书的 Thumbprint

6
我正在开发一个C++应用程序,需要检查证书的Thumbprint。
我找到了这个解决方案检查特定签名, 使用CryptQueryObject()。但我仍然找不到检索Thumbprint的方法。
在C#中,我可以使用方法GetCertHashString获取哈希值(这是我需要的),或者使用属性X509Certificate.Thumbprint 我知道我需要获取公钥的哈希值,但我不知道如何检索公钥。
在C++中,我该怎么做?是否有相应的方法?

也许这会对你有所帮助:https://dev59.com/RGPVa4cB1Zd3GeqP9M0J - Ivaylo Strandjev
2个回答

12

找到了如何做。

你应该使用CryptHashCertificate

就像这样:

DWORD* thumbPrintSize;
BYTE* thumbPrint;   
if (!CryptHashCertificate(0, hashAlg, 0,pCertContext->pbCertEncoded,
     pCertContext->cbCertEncoded, thumbPrint, thumbPrintSize)) {
        return false;
}

pCertContext是证书,hashAlg是哈希算法(通常为sha-1)


它是计算还是从证书中检索? - Mustafa Chelik
1
@MustafaChelik 它计算指纹,因为指纹不存储在证书中。 - X. Liu
CryptHashCertificate已经被弃用,但是CryptHashCertificate2非常相似。然而,我的指纹似乎与属性中的DigitalSignature选项卡中看到的指纹不匹配。 - NiteRain

0
这又是一次对帖子进行死灵术般的回复,但我想指出另一种方法是使用CertGetCertificateContextPropertyCERT_HASH_PROP_ID标志,它将返回证书的SHA1哈希值,或者使用CryptHashCertificate(假设哈希算法为SHA1)来计算哈希值。

如果你想要不同于SHA1的指纹算法,那么这可能不是你想要的,但至少在Windows中,从我所见,似乎仍然使用SHA1。

// most current hashing algorithms top out at about 64 bytes,
// usually much less (20 bytes is very common):
byte thumb[64] = { 0 };
DWORD thumbsz = sizeof(thumb);
if (!CertGetCertificateContextProperty(pCertContext, CERT_HASH_PROP_ID, thumb, &thumbsz))
    return false;

我已经测试了上述内容,并确认它与我在certmgr.msc中所见到的一切相符。虽然我并不是一个wincrypt专家,但如果有好的理由不使用这种方法,请随时纠正我或在下方评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接