在不打开智能卡弹出窗口的情况下设置PIN

问题描述 投票:-1回答:1

我们之前曾经使用过这种方法。

byte[] pinBuffer = Encoding.ASCII.GetBytes(pinCode);
IntPtr providerHandle = IntPtr.Zero;
SafeNativeMethods.Execute(() => SafeNativeMethods.CryptAcquireContext(
    ref providerHandle,
    "keyContainer",
    "My HSM Removable Token Cryptographic Provider",
    1,
    64));
SafeNativeMethods.Execute(() => SafeNativeMethods.CryptSetProvParam(
    providerHandle,
    32,
    pinBuffer,
    0U));
SafeNativeMethods.Execute(() => SafeNativeMethods.CertSetCertificateContextProperty(
    cert.Handle,
    1,
    0U,
    providerHandle));

它不再起作用了。

我在CryptAcquireContext上发生了内部错误。

有没有其他方法可以在不打开弹出窗口的情况下检索证书?

同样的错误

            IntPtr providerHandle = IntPtr.Zero;
            var cspParameters = new CspParameters()
            {
                ParentWindowHandle = providerHandle,
                KeyContainerName = "keyContainer",
                ProviderName = "My HSM Removable Token Cryptographic Provider",
                ProviderType = 1,
                Flags = CspProviderFlags.NoPrompt,
            };
            var rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);

它似乎是NoPrompt(64)旗帜

c# smartcard hsm
1个回答
0
投票

如果您只需要从智能卡获得证书,您可以使用此flag

// dwFlags definitions for CryptAcquireContext
#define CRYPT_VERIFYCONTEXT     0xF0000000

CSP不会尝试获取私钥,因此没有PIN对话框。

Update

来自WinCrypt.h的复制粘贴:

#define CERT_KEY_PROV_HANDLE_PROP_ID        1
#define CRYPT_SILENT            0x00000040
© www.soinside.com 2019 - 2024. All rights reserved.