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

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

我在C Builder Seattle中使用它,但即使是Delphi的例子也会受到赞赏.

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

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

在那之后,我不确定应该将什么发送到服务器以及期待什么作为回报.此时系统应该询问用户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的范围.它为您提供了发送和接收字节的方法,但您必须根据需要提供和读取它们.

点赞