我想使用 Sun 的 MSCAPIProvider 从 Windows 上的 Java 胖客户端的智能卡 (PKI) 获取用户的身份。目标是:
- 用户打开应用
- 提示卡
- 提示输入 PIN
- 我得到了 Java 中的 X509Certicate
- 授予访问权限等
我根据这个stackoverflow question sample 找到了列出 MY 商店中的所有证书,并且我能够使用 Microsoft Smartcard Provider 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()));
现在我面临两个问题:
- 我不知道他的别名可能是什么(鸡鸡蛋问题)
- 如何通过 HTTPS 建立 SSL 上下文来强制使用 X509Cert 进行 PIN 授权?
哪些是缺失的位?