Sun の MSCAPIProvider を使用して、Windows 上の Java ファット クライアントのスマートカード (PKI) からユーザーの ID を取得したいと考えています。ターゲットは次のとおりです。
- ユーザーがアプリを開く
- カードを要求された
- PIN の入力を求められる
- Java で X509Certicate を取得します
- アクセス許可など
このスタックオーバーフローの質問サンプルに基づいて、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つの問題に直面しています:
- 彼の別名が何であるかはわかりません (鶏卵問題)
- HTTPS を介して SSL コンテキストを確立した結果、X509Cert で PIN 認証を強制するにはどうすればよいですか?
欠落しているビットはどれですか?