我有 Gemalto.NET 智能卡。我使用使用sconnect
的 Gemalto 工具将 2 个证书导入其中(我怀疑在 IE 中使用时使用 Crypto API 来执行此操作)。
当我跑
certutil -key -csp "Microsoft Base Smart Card Crypto Provider"
我有以下结果
Microsoft 基础智能卡加密提供程序:
7c168bc3-dc1d-a627-c218-cd45729b42cb [默认容器] AT_KEYEXCHANGEbadd537a-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# 导入新密钥?