我有使用 CNG 密钥和提供者“Microsoft 平台密钥提供者”创建的客户端证书。CNG 密钥具有使用 CNG 参数 NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG 进行强密钥验证的密码。
我正在尝试将证书用于 TLS 连接,并且在我的 SChannel 客户端实现中,我在握手期间收到 PIN 提示,这是正常的。
为了避免 PIN 提示,我尝试使用以下代码模板将 PIN 设置为证书上下文,如此链接 Windows C++ 加密 API:如何禁用智能卡的 pin 代码 UI 中 所述。我确保使用 CRYPT_ACQUIRE_CACHE_FLAG | CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG 在检索 HCRYPTPROV_OR_NCRYPT_KEY_HANDLE 并通过设置属性 NCRYPT_PIN_PROPERTY 设置 PIN 的方法中。因此,将来将为设置 PIN 的相同证书上下文打开相同的 Ncrypt 密钥。
将证书上下文提供给 SCHANNEL_CRED,并传递给 AcquireCredentialsHandle()。但我看到 AcquireCredentialsHandle() 正在从证书上下文中打开 NCrypt 密钥的新对象,最后在握手过程中再次询问 PIN。
我的目标是避免在握手期间出现此 PIN 提示,因为我会以编程方式提供它。如果有人可以帮助我,我将非常感激。