使用 Indy 组件验证智能卡凭据

Using Indy components to verify Smart Card credential

本文关键字:智能卡 验证 Indy 组件 使用      更新时间:2023-10-16

Indy 组件是否有任何功能来验证智能卡 (CAC) 的凭据?我假设它必须与InitializeSecurityContext结合使用。

我正在西雅图C++建造者中使用它,但即使是德尔福的例子也将不胜感激。

这是我到目前为止所发现的:

  1. 打开系统证书存储 ( CertOpenSystemStore ) 并让用户选择一个证书 ( CryptUIDlgSelectCertificateFromStore )。
  2. 获取凭据句柄 ( AcquireCredentialsHandle )。
  3. 使用 TIdTCPClient 连接到我的服务器,并使用安全端口 443 TIdSSLIOHandlerSocketOpenSSL
  4. 调用 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的范围。 它为您提供了传输和接收字节的方法,但您必须根据需要提供和读取它们。