如何重新加载Java安全性KeyStore的密钥?

时间:2018-04-25 06:00:26

标签: keystore pkcs#11 hsm

Provider p = new SunPKCS11(configName);
char[]pin = "****".toCharArray();
KeyStore ks = KeyStore.getInstance("PKCS11", p);
ks.load(null, this.pin);

if (-1 == Security.addProvider(this.p)) {
    throw new RuntimeException("Could not add security provider");
}

如何重新加载密钥?每次运行代码时,我都得到一个KeyStore对象的相同实例,所以键相同。

2 个答案:

答案 0 :(得分:0)

在这里,我看到您没有加载任何密钥库,例如,没有JSK文件。请参见下面的示例代码

File f = new File(kStoreName);
if(f.exists() && !f.isDirectory()){
   try(FileInputStream fis = new FileInputStream(f.getAbsolutePath())){
     ks.load(fis, storePassword.toCharArray());
  }
}

答案 1 :(得分:0)

基本上,Sun Provider实现会缓存Provider实例。因此,您正在应用程序中获取实例。解决此问题的一种方法是手动完成PKCS11提供程序。您可以在其他答案here中找到它。

将属性添加到您的提供程序实例p

p.setProperty("pkcs11LibraryPath", library);

然后在获取密钥之前手动确定PKCS提供程序:

PKCS11 pkcs11 = PKCS11.getInstance(((sun.security.pkcs11.SunPKCS11) provider).getProperty("pkcs11LibraryPath"), null, null, true);
pkcs11.C_Finalize(PKCS11Constants.NULL_PTR);