4

Indy コンポーネントには、スマート カード (CAC) の資格情報を検証する機能のねじれがありますか? と組み合わせて使用​​する必要があると想定していますInitializeSecurityContext

私は C++ Builder Seattle で使用していますが、Delphi の例も歓迎します。

これが私がこれまでに理解したことです:

  1. システム証明書ストアを開き ( CertOpenSystemStore)、ユーザーに証明書を選択させます ( CryptUIDlgSelectCertificateFromStore)。
  2. 資格情報ハンドルを取得します ( AcquireCredentialsHandle)。
  3. セキュア ポート 443 を使用TIdTCPClientしてサーバーに接続します。TIdSSLIOHandlerSocketOpenSSL
  4. SEC_I_CONTINUE_NEEDEDInitializeSecurityContextを返す呼び出し。

その後、何をサーバーに送信する必要があり、何を期待するのかわかりません。また、どの時点でシステムがユーザーに PIN を要求する必要がありますか?

ありがとうございました

4

1 に答える 1

1

を取得SEC_I_CONTINUE_NEEDEDしたら、出力トークン データをサーバーに転送し、応答トークンを待ってから、それを に返すことになっていInitializeSecurityContext()ます。実際にデータをやり取りする方法は、サーバーとの通信に使用している特定のプロトコルによって異なります。

たとえばTIdHTTP、Indy には、TIdSSPINTLMAuthentication使用しているのと同じ API を使用して NTLM 認証を処理するためのクラスがあります。NTML セキュリティ パッケージを初期化し、InitializeSecurityContext()NTLM トークン データを含むバイトのバッファを取得するために使用します。このデータは base64 でエンコードされ、HTTPAuthorization: NTML ...要求ヘッダーに挿入されます。応答が戻ってきたときに、応答トークン データを提供する HTTPWWW-Authenticate: NTLM ...ヘッダーが含まれている場合、データは base64 でデコードされ、結果のバイトが にフィードバックされInitializeSecurityContext()ます。

そのため、サーバーとの通信に使用している通信プロトコルと、そのプロトコルがトークン バイトをやり取りする方法を理解する必要があります。それはインディの範囲外です。バイトを送受信する手段を提供しますが、必要に応じてそれらを供給および読み取る必要があります。

于 2016-01-16T00:05:46.477 に答える