Different types of keystore in Java -- PKCS11

  Pi Ke        2015-01-08 00:39:12       25,105        2          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

PKCS11 密钥库专为硬件安全模块(HSM)设计。它是一个与 HSM 通信的接口。它本身并不实际存储任何密钥,而是提供一组类来与底层的 HSM 通信。实际的密钥和证书存储在 HSM 上。

存储密钥和材料的原因是为了确保安全性和效率。由于密钥位于 HSM 上,因此它们不易被窃取。所有加密/解密操作也在 HSM 上执行,这提高了处理速度。它们经常用于需要高速和额外安全性的应用程序。

有不同的硬件设备可用于存储密钥和证书,例如 nCipher 和来自 SafeNet 的 Luna SA。它们对 Java PKCS11 密钥库的设计提出了很大的挑战,因为它们需要与具有不同结构的不同硬件设备进行通信。

通常,要与硬件设备通信,需要一些配置,还需要创建一个特殊的 PKCS11 提供程序并将其添加到提供程序列表中,创建提供程序的过程可能涉及登录到硬件设备。创建提供程序后,即可加载硬件密钥库。

要创建 PKCS11 提供程序,您可以静态地将提供程序添加到 java.security 文件中,或者在 Java 中使用 Provider 类动态地添加。

要静态创建提供程序,请在位于 $JRE_HOME/lib/security/java.security 的 java.security 文件中添加以下行。

security.provider.N=sun.security.pkcs11.SunPKCS11 /opt/bar/cfg/pkcs11.cfg

这里 N 表示您希望将提供程序放在其中的索引。pkcs11.cfg 是配置文件,它定义了 Java PKCS11 接口可以从 HSM 获取或放入 HSM 的内容。有关详细的配置文件,请咨询 HSM 供应商。

要动态创建提供程序,请在创建硬件密钥库实例之前,在您的应用程序中添加以下代码。

String configName = "/opt/bar/cfg/pkcs11.cfg";
Provider p = new sun.security.pkcs11.SunPKCS11(configName);
Security.addProvider(p);

有关创建 PKCS11 提供程序的详细信息,请阅读 Oracle 文档

提供程序准备就绪后。开始创建 KeyStore 实例。由于它是硬件密钥库,因此在调用 KeyStore.load() 时,输入流应为 null。

以下是创建和加载硬件密钥库的代码片段:

KeyStore ks = KeyStore.getInstance("PKCS11", p); //p 是上面创建的提供程序
ks.load(null, password); 

加载密钥库后,您可以开始在 HSM 上创建密钥(秘密密钥和私钥)和证书。创建它们的方法与 PKCS12 的方法类似。因此,请参考 PKCS12 密钥库 获取详细信息。

一个例外是,无需调用 KeyStore.store() 来保存密钥库,当调用 KeyStore.setKeyEntry() 或其他 KeyStore.setXXX() 时,密钥库将自动保存。

JAVA  KEYSTORE  PKCS11  HSM 

       

  RELATED


  2 COMMENTS


lintao [Reply]@ 2015-01-15 01:36:37

It seems this is a typo. :)

One exception is that there is no need to call KeyStore.store() to save the keystore, the keystore will automatically save when KeyStore.setKeyEntry() is invoked or other KeyStore.setXXX(0 is invoked.

 

Pi Ke [Reply]@ 2015-01-15 06:03:29

Thank you very much. Have corrected it.



  RANDOM FUN

No game no pain