我已经设法在我的applet中使用Sun的MSCAPI提供程序。
我的applet只列出来自Windows证书存储区的证书,并允许用户通过允许用户选择他/她的首选证书来签署他/她的交易。
我想阻止用户在没有USB令牌/智能卡的情况下进行签名,这意味着如果证书的私钥未存储在USB令牌/智能卡中,我的applet不应显示/列出证书。
我检索这样的证书(Removed try catch block):
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,是因为全球需要支持多个品牌的代币,并且要求applet不应该维护PKCS11的列表每个令牌都有dll路径。也不接受从服务器端检索dll路径。所以在这种情况下我不能使用PKCS11。如果我错了请纠正我。)
答案 0 :(得分:0)
我认为现在回复为时已晚。
每个 USB 令牌提供商都会为其令牌提供定制的驱动程序。 Ex.ePass 或 ProxKey 有它自己的驱动程序。驱动程序 (DLL/SO) 文件的位置会有所不同。驱动程序的文件名也会有所不同。所以你不能在没有提到正确的驱动程序路径的情况下读取/初始化它们。你可以去https://github.com/joelhockey/jacknji11