微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从证书中获取有效的 CNG 私钥句柄

如何解决如何从证书中获取有效的 CNG 私钥句柄

我正在尝试获取一个 CNG 私钥句柄来对每个证书的数据进行签名。 但首先,我很难获得有效的密钥句柄。

通过指纹的证书查找工作正常。我收到了提供私钥的自签名证书的上下文。

据报告 CryptAcquireCertificatePrivateKey调用成功,LKeyHandle内容非零且 LKeySpec 描述了 Ncrypt 密钥。

不过,NCryptIsKeyHandle 总是返回 False。因此,我的代码引发了异常。 请帮助我理解为什么 LKeyHandle 无效。

FCertStore := CertOpenStore(CERT_STORE_PROV_SYstem,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,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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。