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

时间:2016-01-15 18:29:29

标签: c++ delphi c++builder indy10 c++builder-10-seattle

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

我在C ++ Builder Seattle中使用它,但即使是Delphi示例也会受到赞赏。

这是我到目前为止所知道的:

  1. 打开系统证书存储区(CertOpenSystemStore)并让 用户选择证书(CryptUIDlgSelectCertificateFromStore)。
  2. 获取凭据句柄(AcquireCredentialsHandle)。
  3. 使用TIdTCPClientTIdSSLIOHandlerSocketOpenSSL使用安全端口443连接到我的服务器。
  4. 致电InitializeSecurityContext,返回 SEC_I_CONTINUE_NEEDED
  5. 之后我不确定应该将什么发送到服务器以及期待什么。此外,系统应该向用户询问PIN码吗?

    谢谢

1 个答案:

答案 0 :(得分:1)

当您获得SEC_I_CONTINUE_NEEDED时,您应该将输出令牌数据传输到服务器,等待响应令牌,然后将其传递回InitializeSecurityContext()。现在,您实际上如何来回传输数据取决于您用来与服务器通信的特定协议。

例如,在TIdHTTP中,Indy有一个TIdSSPINTLMAuthentication类,用于使用您使用的相同API处理NTLM身份验证。它初始化NTML安全包,然后使用InitializeSecurityContext()检索包含NTLM令牌数据的字节缓冲区,然后将base64编码放入HTTP Authorization: NTML ...请求标头中。当响应返回时,如果它具有提供响应令牌数据的HTTP WWW-Authenticate: NTLM ...标头,则数据将被解码,并将结果字节反馈到InitializeSecurityContext()

因此,您需要确定用于与服务器通信的通信协议,以及该协议期望您来回传输令牌字节的方式。这超出了Indy的范围。它为您提供了发送和接收字节的方法,但您必须根据需要提供和读取它们。