gpt4 book ai didi

Java - PKCS11 和 MSKeyStore

转载 作者:行者123 更新时间:2023-11-29 09:18:18 25 4
gpt4 key购买 nike

我正在尝试使用来自 MS-KeyStore 的不同证书对字符串进行签名。但是,我知道有从 MS-Keystore 中的 token 导入的 key 。所以,我的问题是 - 如果我通过 keystore 并尝试使用引用 pkcs11 的证书进行签名,我会弹出一个窗口来输入 pkcs11 密码。如何检查证书是否来 self 的 token ?

提前致谢!!!

这是我现在的代码:

  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 或多或少打算封装和隐藏证书/ key 的来源。

判断您的 key /证书来自 PKCS#11 设备的安全方法是使用 SUN PKCS#11 provider .但是,这样做的缺点是您需要静态指定 native PKCS#11 库的路径(在您可以静态配置提供程序的 java.security 文件中)或动态请求它作为用户输入。

如果在您的情况下使用 PKCS#11 提供程序太麻烦,我建议实现一个证书选择对话框来过滤合适的证书。将 MSCAPI 限制为 PKCS#11 原始证书不会立即提高安全性 - 您的用户可能有充分的理由安装其他证书/ key (通常以 PKCS#12 文件的形式)。您应该只检查(并帮助用户已经根据此标准过滤证书)最终选择的证书/ key 是否符合您的标准:正确的 key 使用(例如数字签名)、合理的扩展 key 使用、可接受的或已知的策略存在于证书等

在欧盟,我们正在慢慢朝着“安全签名创 build 备上的合格证书”的概念发展。这意味着此类设备(例如智能卡)上附带的证书将包含特殊策略,禁止 CA 将这些策略用于任何其他证书,例如软件证书。因此,这将有效地让您确保证书来自安全的硬件设备。您可能会检查所涉及的证书是否支持此功能。这ETSI document列出了您必须查找的相应 OID。

关于Java - PKCS11 和 MSKeyStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8080629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com