【问题标题】:How to reload keys of Java security KeyStore?如何重新加载 Java 安全 KeyStore 的密钥?
【发布时间】:2018-04-25 06:00:26
【问题描述】:
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 对象实例,因此得到相同的键。

【问题讨论】:

  • 所以按照您的说法,当您获得 KeyStore 对象的相同实例时,您是否无法加载/检索新生成的密钥?
  • 是的,我无法重新加载密钥。他们是一样的

标签: keystore pkcs#11 hsm


【解决方案1】:

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

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

【讨论】:

  • 问题提到了PKCS11 KeyStore,它是一个基于硬件令牌的。您的回答提到了JKS,这是一个基于文件的密钥库(软)。它不适用于 PKCS11 KeyStore。
【解决方案2】:

基本上,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2018-06-14
    • 2014-10-18
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多