1

証明書ごとにデータに署名するために、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;
4

0 に答える 0