4

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

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

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

  1. 打开系统证书存储 ( CertOpenSystemStore) 并让用户选择一个证书 ( CryptUIDlgSelectCertificateFromStore)。
  2. 获取凭据句柄 ( AcquireCredentialsHandle)。
  3. TIdTCPClient使用和TIdSSLIOHandlerSocketOpenSSL使用安全端口 443连接到我的服务器。
  4. InitializeSecurityContext返回SEC_I_CONTINUE_NEEDED的调用。

之后,我不确定应该将什么发送到服务器以及期望得到什么回报。此外,系统应该在什么时候向用户询问 PIN 码?

谢谢

4

1 回答 1

1

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

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

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

于 2016-01-16T00:05:46.477 回答