我正在尝试获取 CNG 私钥句柄来对每个证书的数据进行签名。但首先,我正在努力获得一个有效的密钥句柄。
通过指纹查找证书正在工作。我正在接收提供私钥的自签名证书的上下文。
据报道调用CryptAcquireCertificatePrivateKey
是成功的,内容LKeyHandle
是非零的并且LKeySpec
描述了一个 Ncrypt 密钥。
尽管如此,NCryptIsKeyHandle
总是返回False
。因此,我的代码引发了异常。请帮助我理解为什么LKeyHandle
不被认为是有效的。
FCertStore := CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0,
CERT_SYSTEM_STORE_CURRENT_USER or CERT_STORE_READONLY_FLAG,
PWideChar('My'));
SetLength(LFingerprintHex, 20);
LSize := HexToBin(PWideChar('d159975092f813d8a17f97fbb3152f600daecdbc'), @LFingerPrintHex[0], 20);
SetLength(LFingerPrintHex, LSize);
LFingerprint.cbData := Length(LFingerPrintHex);
LFingerprint.pbData := @LFingerPrintHex[0];
LCertContext := CertFindCertificateInStore(FCertStore, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
0, CERT_FIND_SHA1_HASH,
@LFingerprint, nil);
if CryptAcquireCertificatePrivateKey(LCertContext, $40000 {CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG},
nil, LKeyHandle, @LKeySpec, @LFreeHandle) and
(LKeySpec = $FFFF {CERT_NCRYPT_KEY_SPEC}) and
not NCryptIsKeyHandle(LKeyHandle) then
begin
raise Exception.Create('invalid handle'); // but why?
end;