我设法在我的小程序中使用了 Sun 的 MSCAPI 提供程序。
我的小程序只是列出了来自 Windows 证书存储的证书,并允许用户通过允许用户选择他/她的首选证书来签署他/她的交易。
我想防止用户在没有 USB 令牌/智能卡的情况下进行签名,这意味着如果我的小程序的私钥未存储在 USB 令牌/智能卡中,我的小程序不应显示/列出证书。
我检索这样的证书(删除了 try catch 块):
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStore.load(null);
enumeration = keyStore.aliases();
while(enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
Certificate ksCertificate = keyStore.getCertificate(alias);
...
}
我像这样管理签名(删除了 try catch 块):
// Retrieve private key
privateKey = (PrivateKey) keyStore.getKey(alias, null);
// Sign data by using certificate's signing algorithm
Signature signer = Signature.getInstance(certificate.getSigAlgName(), keyStore.getProvider());
signer.initSign(privateKey);
signer.update(data);
result = signer.sign();
我找不到任何方法来区分证书是否来自 USB 令牌。我检查了 Certificate 和 PrivateKey 对象,但是我找不到任何对我有帮助的属性。
有关如何使用 MSCAPI 执行此操作的任何建议?或者作为 MSCAPI 替代方案的任何建议?
(我不/不能使用PKCS11的原因是需要在全球范围内支持多个品牌的令牌,并且要求小程序不应该为每个令牌在内部维护PKCS11 dll路径列表。检索dll也不接受来自服务器端的路径。所以在这种情况下,我不能使用 PKCS11。如果我错了,请纠正我。)