gpt4 book ai didi

delphi - 如何使用 CNG 从智能卡(USB token )获取证书存储?

转载 作者:行者123 更新时间:2023-12-04 13:59:59 25 4
gpt4 key购买 nike

我正在使用 Crypto API 的 CryptAcquireContext 函数 ( https://docs.microsoft.com/en-us/windows/desktop/api/Wincrypt/nf-wincrypt-cryptacquirecontexta ) 来访问我的 USB token 中包含的证书存储,这就像一个魅力!

但是,不推荐使用 CryptAcquireContext 函数,Crypto API 文档建议使用 CNG 来实现相同的结果。我现在所有的问题是如何使用 CNG 从我的 USB token 中获取证书上下文,并为此我使用以下代码:

var
Provider: NCRYPT_PROV_HANDLE;
Reader: PByte;
ReaderSize: DWORD;
MemorySize: DWORD;
begin
// Get a handle to the smartcard reader specific provider
Status := NCryptOpenStorageProvider(@Provider
,'SafeSign Standard RSA and AES Cryptographic Service Provider'
,0); // returns ERROR_SUCCESS
// Convert the name of the reader to a PByte
UnicodeStringToBinary('Giesecke & Devrient GmbH StarSign CUT 0',Reader,ReaderSize);

// Inform the name of the reader to the CNG
Status := NCryptSetProperty(Provider
,NCRYPT_READER_PROPERTY
,Reader
,ReaderSize
,0); // returns ERROR_SUCCESS

MemorySize := SizeOf(HCERTSTORE);

// Try to get the size needed to a variable of type HCERTSTORE.
// This is the first step before get the certificate store
Status := NCryptGetProperty(Provider
,NCRYPT_USER_CERTSTORE_PROPERTY
,nil
,0
,@MemorySize
,0); //Returns 0x80090029 (NTE_NOT_SUPPORTED)
end;

如您所见 NCryptGetProperty函数失败,错误代码 0x80090029这意味着 NTE_NOT_SUPPORTED .我做错了什么?我找到了一个和我一样的例子(C++),所以,我想我的实现一切都很好,但是......

我的目标是列出我的智能卡上的所有证书(实际上是一个 USB token )。我可以使用 Crypto API 来做到这一点,但 CryptAcquireContext函数已弃用,因此,我需要使用另一个。使用 CAPI 我获得了证书存储,我可以使用默认的证书对话框列出它,所以,我需要使用 CNG,让证书存储做同样的事情,但我现在做的方式似乎是错误的。

好吧,一些观察:
  • 我不检查这里的返回(状态变量)以简化此代码示例
  • UnicodeStringToBinary 函数是严格正确的。返回的缓冲区 (PByte) 的大小是原始字符串的两倍,并且字节都是“nn 00 nn 00 nn 00”,因此,Reader 变量包含一个 Unicode 字符串,就像 NCRYPT_READER_PROPERTY 属性要求的那样。我可以根据要求发布代码。
  • 我的 NCryptOpenStorageProvider 签名更接近 Windows API 版本,因此,它的第一个参数是指向 NCRYPT_PROV_HANDLE
  • 的指针。

    最佳答案

    我不使用 delphi ......但读取器名称必须以空字符结尾。
    我在 .NET 中使用 Microsoft Smart Card Key Storage Provider 完成了这项工作和电话:

    NCrypt.NCryptSetProperty(
    provider,
    NCrypt.KeyStoragePropertyIdentifiers.NCRYPT_READER_PROPERTY,
    Encoding.Unicode.GetBytes(smartCardReader + '\0')
    );

    关于delphi - 如何使用 CNG 从智能卡(USB token )获取证书存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072217/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com