我正在尝试使用 MS-KeyStore 中的不同证书签署一个字符串。
但是,我知道有从 MS-Keystore 中的令牌导入的密钥。
所以,我的问题是 - 如果我通过密钥库并尝试使用引用 pkcs11 的证书进行签名,我会弹出一个窗口,要求输入 pkcs11 密码。
如何检查证书是否来自我的令牌?
提前致谢!!!
这是我现在的代码:
String alias;
byte[] data = "test".getBytes();
char[] pin = "pass".toCharArray();
try {
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pin);
System.out.println("Provider: "+ks.getProvider());
System.out.println("KS size: " + ks.size());
Enumeration enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
alias = (String) enumeration.nextElement();
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, null);
Certificate certificate = ks.getCertificate(alias);
Provider provider = ks.getProvider();
Signature signature = Signature.getInstance("SHA1withRSA", provider);
try {
signature.initSign(privateKey);
signature.update(data);
byte[] signedSignature = signature.sign();
System.out.println("\tGenerated signature for " + alias);
signature.initVerify(certificate);
signature.update(data);
if (signature.verify(signedSignature)) {
System.out.println("\tSignature verifified for " + alias);
} else {
System.out.println("\tCould not verify signature for " + alias);
}
} catch (Exception ex) {
System.out.println("\tError for " + alias);
}
}
} catch (KeyStoreException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (CertificateException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (UnrecoverableKeyException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
恐怕您无法可靠地判断证书的来源,至少在 MS CAPI 提供程序的 Java 级别上无法判断。但这是设计的一部分 - MS CAPI 或多或少打算封装和隐藏证书/密钥的来源。
判断您的密钥/证书来自 PKCS#11 设备的安全方法是使用SUN PKCS#11 提供商。但是,这样做的缺点是您需要静态指定本机 PKCS#11 库的路径(在 java.security 文件中,您可以在其中静态配置提供程序)或动态请求它作为用户输入。
如果在您的情况下使用 PKCS#11 提供程序太麻烦,我建议实现一个证书选择对话框来过滤合适的证书。将 MSCAPI 限制为源自 PKCS#11 的证书不会立即提高安全性 - 您的用户可能有充分的理由安装了其他证书/密钥(通常以 PKCS#12 文件的形式)。您应该只检查(并帮助用户根据此标准过滤证书)最终选择的证书/密钥是否符合您的标准:正确的密钥使用(例如数字签名)、健全的扩展密钥使用、可接受或已知的策略存在于证书等
在欧盟,我们正在慢慢朝着“安全签名创建设备上的合格证书”的概念发展。这意味着此类设备(例如智能卡)上附带的证书将包含特殊策略,CA 禁止将这些策略用于任何其他证书(例如软件证书)。因此,这将有效地允许您确保证书源自安全的硬件设备。您可以检查所涉及的证书是否支持此功能。这欧洲电信标准协会文件列出您必须查找的相应 OID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)