Indy组件是否具有验证智能卡(CAC)凭据的任何功能?我假设它必须与InitializeSecurityContext
一起使用。
我在C ++ Builder Seattle中使用它,但即使是Delphi示例也会受到赞赏。
这是我到目前为止所知道的:
CertOpenSystemStore
)并让
用户选择证书(CryptUIDlgSelectCertificateFromStore
)。AcquireCredentialsHandle
)。TIdTCPClient
和TIdSSLIOHandlerSocketOpenSSL
使用安全端口443连接到我的服务器。InitializeSecurityContext
,返回 SEC_I_CONTINUE_NEEDED 。之后我不确定应该将什么发送到服务器以及期待什么。此外,系统应该向用户询问PIN码吗?
谢谢
答案 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的范围。它为您提供了发送和接收字节的方法,但您必须根据需要提供和读取它们。