【问题标题】:Using Indy components to verify Smart Card credential使用 Indy 组件验证智能卡凭证
【发布时间】:2016-01-15 18:29:28
【问题描述】:

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

我在西雅图的 C++ Builder 中使用它,但即使是 Delphi 示例也将不胜感激。

这是我目前所知道的:

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

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

谢谢

【问题讨论】:

  • Indy 组件没有智能卡或支付终端 (POS) 的东西。你必须自己写。你还没有确定支付终端类型,但即使你确定了,我可以告诉你,这里没有人会为你写一大块 POS 支付系统代码。 INDY 的关注点是为基本的 IETF RFC 协议提供组件,例如 HTTP、FTP 等。你所说的被称为应用层问题。通过 HTTP 和 HTTPS 来回传输的东西不是 Indy 的问题,而是您的问题。
  • 这与任何形式的付款无关。军方使用称为“通用访问卡”(AKA CAC)的东西进行识别/验证。该卡包含一堆用于不同目的的证书,其想法是多步骤验证。在这种情况下,用户必须拥有独特的东西(卡)并知道一些东西(用于访问卡上证书的密码)。我正在编写一个需要使用智能卡上的证书对用户进行身份验证的应用程序。我也知道印地的角色。正如我上面所说,我已经连接到服务器。我不知道要发送和接收什么。
  • 这仍然是一个非常小的垂直市场应用关注点。 Indy 不处理“我不知道如何向我的服务器发送字节”的问题。你会的。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多