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.