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() 时,密钥库将自动保存。
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.