1

我有 Gemalto.NET 智能卡。我使用使用sconnect
的 Gemalto 工具将 2 个证书导入其中(我怀疑在 IE 中使用时使用 Crypto API 来执行此操作)。

当我跑

certutil -key -csp "Microsoft Base Smart Card Crypto Provider"

我有以下结果

Microsoft 基础智能卡加密提供程序:
7c168bc3-dc1d-a627-c218-cd45729b42cb [默认容器] AT_KEYEXCHANGE

badd537a-a377-431b-cbc9-8699dbe15e0e AT_KEYEXCHANGE

LoadKeys 返回的 Key 不存在。0x8009000d (-2146893811) CertUtil: -key 命令成功完成。

现在我想在我的 C# 程序中找到这些键。为此,我编写了以下方法,该方法应返回特定智能卡上的所有密钥。

static List<string> EnumerateContainers(string card)
{
    var list = new List<string>();
    var provider = IntPtr.Zero;
    if (!CryptAcquireContext(ref provider, @"\\.\" + card + @"\", "Microsoft Base Smart Card Crypto Provider", 1, CspProviderFlags.UseMachineKeyStore))
        Debug.WriteLine("no context for " + card);

    uint bufferSize = 4096;
    var container = new StringBuilder((int)bufferSize);
    uint flags = CRYPT_FIRST;
    while(CryptGetProvParam(provider, PP_ENUMCONTAINERS, container, ref bufferSize, flags))
    {
        list.Add(container.ToString());
        flags = 0;
    }
    return list;
}

但我的方法只找到默认的密钥 7c168bc3-dc1d-a627-c218-cd45729b42cb。 我应该怎么做才能找到存储在智能卡上的所有密钥/容器?

然后

如何删除这些密钥并使用 C# 导入新密钥?

4

1 回答 1

2

我遇到了同样的问题,并且在网上看到了类似的帖子,但最后我找到了答案……通过检查错误代码!

原因是 pcbData 的值被调用的实现改变(以反映返回数据的长度)并且必须在每次调用之前设置为缓冲区的大小。

失败后检查GetLastError显示错误234,正是这样!

实际上,这似乎是“使用 CAPICOM 和 P/Invoke 扩展 .NET 加密”(http://msdn.microsoft.com/en-us/library/ms867087.aspx)的代码示例中的错误的传播

dwFlags=CRYPT_FIRST;  //required initalization
StringBuilder sb = new StringBuilder(BUFFSIZE);
while (Win32.CryptGetProvParam(hProv, enumflags, sb, ref pcbData, dwFlags)) 
{
    dwFlags=0;            //required to continue entire enumeration
    containernames.Add(sb.ToString());
}

pcbData = BUFFSIZE;循环内缺少的地方。

于 2010-01-08T09:40:33.167 回答