2

Sun の MSCAPIProvider を使用して、Windows 上の Java ファット クライアントのスマートカード (PKI) からユーザーの ID を取得したいと考えています。ターゲットは次のとおりです。

  1. ユーザーがアプリを開く
  2. カードを要求された
  3. PIN の入力を求められる
  4. Java で X509Certicate を取得します
  5. アクセス許可など

このスタックオーバーフローの質問サンプルに基づいて、MY ストア内のすべての証明書を一覧表示し、Microsoft スマートカード プロバイダーの PIN プロンプトでいくつかのバイトに署名できることがわかりました。

これは私のコードです:

Provider provider = Security.getProvider("SunMSCAPI");
KeyStore store = KeyStore.getInstance("Windows-MY", provider);
store.load(null, null);

System.out.println(store);
Enumeration<?> aliases = store.aliases();
while(aliases.hasMoreElements()) {
    String alias = aliases.nextElement().toString();
    Certificate[] signerKey = (Certificate[]) store.getCertificateChain(alias);
    Object entry = store.getKey(alias, null);
    System.out.println(alias + " " + Arrays.toString(signerKey));
    System.out.println(entry);
}

Signature sig = Signature.getInstance("SHA1withRSA",provider);
PrivateKey key = (PrivateKey) store.getKey("Michael-O", null);

sig.initSign(key);
sig.update("Test".getBytes());
System.out.println(Arrays.toString(sig.sign()));

今、私は2つの問題に直面しています:

  1. 彼の別名が何であるかはわかりません (鶏卵問題)
  2. HTTPS を介して SSL コンテキストを確立した結果、X509Cert で PIN 認証を強制するにはどうすればよいですか?

欠落しているビットはどれですか?

4

1 に答える 1

0

Windows の場合、通常、スマートカードのベンダーは 2 つのドライバーを提供しています。

  • 1 つは、 PKCS11プロトコルを使用してスマートカードにアクセスして署名するためのものです。
  • もう 1 つは、Windows 暗号化サービス プロバイダー (別名CSP )を使用してアクセスし、署名します。

プロバイダーを使用するとSunMSCAPI、ローカル ユーザーの Windows キーストアにアクセスできます。CSP スマートカード ドライバーがインストールされている場合は、そのキーストアにアクセスできます。それを介してスマートカード証明書を確認することもできます (ただし、Windows キーストアがインターフェイスとして機能するため、ローカル証明書とスマートカード証明書の違いを知ることはできません)。

sunMSCAPIを介してスマート カードの公開証明書にアクセスしようとすると、公開鍵にアクセスすることになるため、PIN を導入する必要はありません。ただし、署名を実行しようとすると、Windows キーストアが操作をスマートカードCSPに委任し、 PINの入力を求めるプロンプトが表示されます。

今、あなたの2つの特定の質問に答えようとしています:

  1. 彼の別名が何であるかはわかりません (鶏卵問題)

オプションとして、すべての証明書 (サブジェクトやシリアル番号など) からの情報をポップアップに出力し (エイリアスと表示する説明との関係を維持)、ユーザーが使用する証明書を選択できるようにし、内部的に使用できるようにすることができます。選択した証明書を参照するエイリアス。これはhttps、クライアント認証が必要なときに認証が機能するのと同じです。ブラウザには、認証に使用できる証明書が表示されます。

サーバーでいくつhttpsかのフィルターを作成して、いくつかの基準に一致する証明書のみを表示できます (たとえば、apache では、特定の CA に対して発行された証明書など、いくつかの基準から証明書をフィルタリングできます) が、最終的にユーザーは実行する目的のものを選択する必要があります。認証。

たとえば、キーストアから証明書属性または証明書チェーンを取得し、要件に適合すると思われるもののみを表示する、ある種のフィルターを実行することもできます...しかし、最終的にフィルターの後に複数ある場合は、許可する必要がありますどちらを選択するかはユーザーが決定します。

  1. HTTPS を介して SSL コンテキストを確立した結果、X509Cert で PIN 認証を強制するにはどうすればよいですか?

sunMSCAPIプロバイダーを介して秘密鍵アクセス操作をスマートカードCSPに委任する場合、 PINを気にする必要はないと思います。CSPに任せてください。

何らかの理由でPINを保持する必要がある場合、考えられるオプションは、別のプロバイダー ( ) を使用して( CSPSunPKCS11経由ではなく) スマートカードを直接インスタンス化し、 (@Maarten Bodewes がコメントで提案しているように) を使用して処理することです。 . ただし、シナリオですべてのクライアントが Windows 上にある場合は、いくつかの異なるスマートカードからの異なるPKCS11ドライバー実装の問題を回避するために、同じように使用することをお勧めします。CallbackHandlersunMSCAPI

于 2016-09-26T12:24:37.837 に答える