2016-01-15 54 views
4

Indy組件是否有任何功能來驗證智能卡(CAC)的憑證?我假設它必須與InitializeSecurityContext一起使用。使用Indy組件驗證智能卡憑證

我在C++ Builder西雅圖中使用它,但即使是德爾福的例子,將不勝感激。

這是我迄今想通了:

  1. 開放系統證書存儲區(CertOpenSystemStore),並讓用戶 選擇證書(CryptUIDlgSelectCertificateFromStore)。
  2. 獲取憑證句柄(AcquireCredentialsHandle)。
  3. 連接到使用安全端口443
  4. 呼叫InitializeSecurityContext返回SEC_I_CONTINUE_NEEDED使用TIdTCPClientTIdSSLIOHandlerSocketOpenSSL我的服務器。

之後,我不知道應該發送到服務器什麼,以及期待什麼回報。此時系統應該詢問用戶PIN碼?

謝謝

+0

Indy組件沒有智能卡或支付終端(POS)的東西。你必須自己寫。您還沒有確定付款終端的類型,但即使您已經這樣做,我也可以告訴您,沒有人會爲您寫出一大堆POS支付系統代碼。 INDY的關注點是爲基本的IETF RFC協議提供組件,比如HTTP,FTP等。你在談論什麼叫做APPLICATION LAYER關注。通過HTTP和HTTPS來回傳遞的內容不是Indy的問題,而是您自己的問題。 –

+1

這不涉及任何形式的付款。軍方使用「通用訪問卡」(AKA CAC)進行識別/驗證。該卡包含一堆用於不同目的的證書,該想法是多步驟驗證。在這種情況下,用戶必須擁有唯一的(卡)和知道的東西(用於訪問卡上證書的引腳)。我正在編寫一個應用程序,需要使用智能卡上的證書對用戶進行身份驗證。我也知道Indy的角色。正如我上面所說,我已經連接到服務器。我不知道要發送和接收什麼。 – Sam

+0

這仍然是一個非常小的垂直市場應用關注。 Indy不處理問題「我不知道如何發送字節到我的服務器」。你做。 –

回答

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的範圍之內。它爲您提供傳輸和接收字節的方法,但您必須根據需要提供並讀取它們。