使用 Indy 组件验证智能卡凭据
Using Indy components to verify Smart Card credential
Indy 组件是否有任何功能来验证智能卡 (CAC) 的凭据?我假设它必须与InitializeSecurityContext
结合使用。
我正在西雅图C++建造者中使用它,但即使是德尔福的例子也将不胜感激。
这是我到目前为止所发现的:
- 打开系统证书存储 (
CertOpenSystemStore
) 并让用户选择一个证书 (CryptUIDlgSelectCertificateFromStore
)。 - 获取凭据句柄 (
AcquireCredentialsHandle
)。 - 使用
TIdTCPClient
连接到我的服务器,并使用安全端口 443TIdSSLIOHandlerSocketOpenSSL
。 - 调用
InitializeSecurityContext
返回SEC_I_CONTINUE_NEEDED。
之后,我不确定应该将什么发送到服务器以及期望什么作为回报。另外,在什么时候系统应该要求用户输入 PIN?
谢谢
当你得到SEC_I_CONTINUE_NEEDED
时,你应该将输出令牌数据传输到服务器,等待响应令牌,然后将其传递回InitializeSecurityContext()
。 现在,实际来回传输数据的方式取决于您用于与服务器通信的特定协议。
例如,在 TIdHTTP
中,Indy 有一个 TIdSSPINTLMAuthentication
类,用于使用您正在使用的同一 API 处理 NTLM 身份验证。 它初始化 NTML 安全包,然后使用 InitializeSecurityContext()
检索包含 NTLM 令牌数据的字节缓冲区,然后将其进行 base64 编码放入 HTTP Authorization: NTML ...
请求标头中。 当响应返回时,如果它有一个提供响应令牌数据的 HTTP WWW-Authenticate: NTLM ...
标头,则数据将被 base64 解码,生成的字节将反馈到 InitializeSecurityContext()
中。
服务器通信,以及该协议如何期望您来回传输令牌字节。 这超出了Indy的范围。 它为您提供了传输和接收字节的方法,但您必须根据需要提供和读取它们。
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- LibGit2 SSH身份验证失败
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- constexpr上下文中std::initializer_list的验证
- 正在验证c++中用户的整数输入
- 加密++验证大文件签名
- C++卡验证问题
- 验证指针链
- 此代码验证公式是什么意思?
- cin 的十进制输入验证?
- 简单的 HTML 验证器
- 密码长度验证 (c++)
- 输入验证以筛选出字符、字符串和一系列整数
- 如何使用 CredUIPromptForWindowsCredentials验证凭据
- 指针验证的最佳实践?
- RSA_PKCS1签名验证
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 使用 C++ 验证 NMEA 句子
- 使用 Indy 组件验证智能卡凭据