2

我想使用 Sun 的 MSCAPIProvider 从 Windows 上的 Java 胖客户端的智能卡 (PKI) 获取用户的身份。目标是:

  1. 用户打开应用
  2. 提示卡
  3. 提示输入 PIN
  4. 我得到了 Java 中的 X509Certicate
  5. 授予访问权限等

我根据这个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()));

现在我面临两个问题:

  1. 我不知道他的别名可能是什么(鸡鸡蛋问题)
  2. 如何通过 HTTPS 建立 SSL 上下文来强制使用 X509Cert 进行 PIN 授权?

哪些是缺失的位?

4

1 回答 1

0

对于 Windows 情况,通常智能卡供应商提供两个驱动程序。

  • 一种使用PKCS11协议使用智能卡访问和签名。
  • 另一个使用 Windows 加密服务提供商(又名CSP)访问和签名的服务

当您使用SunMSCAPI提供程序时,您可以访问本地用户 windows 密钥库,如果上面安装了一些 CSP 智能卡驱动程序;您还可以通过它查看智能卡证书(但您无法知道本地和智能卡证书之间的区别,因为 Windows 密钥库充当接口)。

如果您尝试通过sunMSCAPI访问智能卡的公共证书,则您正在访问公共密钥,因此无需引入 PIN。但是,如果您尝试执行签名,则 Windows 密钥库会将操作委托给智能卡CSP,它将提示您输入 PIN

现在尝试回答您的两个具体问题:

  1. 我不知道他的别名可能是什么(鸡鸡蛋问题)

一个选项可以是在弹出窗口中打印所有证书(例如主题或序列号)的信息(保持别名和您显示的描述之间的关系),让用户选择要使用的证书,然后在内部您可以使用引用所选证书的别名;这就像任何https需要客户端身份验证的身份验证一样;浏览器向您显示可能的证书进行身份验证。

您可以在https服务器中制作一些过滤器以仅显示符合某些标准的证书(例如,您可以从某些标准过滤证书;例如为特定 CA 颁发的证书),但最终用户必须选择所需的证书来执行验证。

您还可以执行某种过滤器,例如从密钥库获取证书属性或证书链,并仅显示您认为符合要求的那些...但最后,如果您必须让过滤器之后有多个用户决定要选择哪一个。

  1. 如何通过 HTTPS 建立 SSL 上下文来强制使用 X509Cert 进行 PIN 授权?

如果您通过sunMSCAPI提供商将私钥访问操作委托给智能卡CSP ,我认为您可以不关心PIN,让CSP为您处理。

如果由于某种原因您需要保留PINSunPKCS11那么一个可能的选择是使用不同的提供程序CallbackHandler( . 但是恕我直言,如果在这种情况下所有客户端都在 Windows 上,我建议您照常使用sunMSCAPI,以避免来自某些不同智能卡的不同PKCS11驱动程序实现出现问题。

于 2016-09-26T12:24:37.837 回答