【发布时间】:2020-01-13 16:11:19
【问题描述】:
我正在尝试使用 Windows CryptoAPI 从证书存储访问证书的公钥。它适用于 x86 项目配置,但在 x64 配置中失败,因为它填充的结构为空。我无法更改项目的配置,因为我必须更改很多东西。 有人知道在 x64 位配置中的方法吗?
这是我在 x86 上的:
HCERTSTORE CertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"My" );
PCCERT_CONTEXT CertContext = CertFindCertificateInStore( CertStore, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, CertName, NULL );
CryptDecodeObjectEx((PKCS_7_ASN_ENCODING | X509_ASN_ENCODING),
CNG_RSA_PUBLIC_KEY_BLOB,
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, // The pbData member is filled correctly
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, // The cbData member is filled with the correct length of the public key
CRYPT_ENCODE_ALLOC_FLAG,
NULL,
&DecodedPublicKey,
&DecodedPublicLength); // Executes with success, returns the public key, which I am sure is correct, because I tested it.
对于 x64,我有完全相同的东西,但是 pbData 和 cbData 成员不是从 CertFindCertificateInStore 填充的:
HCERTSTORE CertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"My" );
PCCERT_CONTEXT CertContext = CertFindCertificateInStore( CertStore, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, CertName, NULL );
CryptDecodeObjectEx((PKCS_7_ASN_ENCODING | X509_ASN_ENCODING),
CNG_RSA_PUBLIC_KEY_BLOB,
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, // pbData member is null
CertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, // cbData member is 0
CRYPT_ENCODE_ALLOC_FLAG,
NULL,
&DecodedPublicKey,
&DecodedPublicLength);
其实CertContext的每一个成员都是空的,但是CertFindCertificateInStore却没有返回null,真是奇怪。对我来说似乎是一个错误......
【问题讨论】:
-
出于好奇,我googled "Windows CryptoAPI Certificate public key accessing at x64 configuration"。也许,你会发现一些有用的东西。 (第一击是你的问题本身。);-)
-
但是,我在secureblackbox.com 上发现了这个可能有用的信息:有时通过 TElWinCertStorage 访问硬件私钥会导致失败。当硬件 CSP 供应商不提供 64 位版本的驱动程序时,通常会发生这种情况。这个问题可以通过明确地将用户的应用程序定位到 x86/x64 平台来解决。
-
您没有使用任何不同的 32 位或 64 位代码。如果代码中没有错误,结果将是相同的。 实际上,CertContext 的每个成员都是空的,但是 CertFindCertificateInStore 没有返回 null - 不可能。或者你在你的过程中粘贴了不完整的工作代码或糟糕的外观或一些钩子
标签: c++ windows ssl-certificate cryptoapi