金鑰庫是一個用於儲存加密金鑰和憑證的儲存設施。它們最常在 SSL 通訊中使用,以驗證伺服器和用戶端的身份。金鑰庫可以是檔案或硬體裝置。根據金鑰庫的類型,有三種可以儲存在金鑰庫中的項目。
三種類型的項目是:
PrivateKey:這是一種用於非對稱加密的密鑰類型。由於其敏感性,它通常受密碼保護。它也可以用於簽署數位簽章。
Certificate:憑證包含一個公鑰,可以用於識別憑證中聲稱的主體。它通常用於驗證伺服器的身份。有時在請求時也用於識別用戶端。
SecretKey:一個用於對稱加密的密鑰項目。
根據金鑰庫可以儲存的項目以及金鑰庫如何儲存這些項目,Java 中有幾種類型的金鑰庫:JKS、JCEKS、PKCS12、PKCS11 和 DKS。您可以在Oracle 的 Java 加密架構說明中找到這些金鑰庫的介紹。
接下來,我們將概述這些金鑰庫類型。
JKS,Java 金鑰庫。您可以在 sun.security.provider.JavaKeyStore 中找到此檔案。此金鑰庫是 Java 專用的,它通常具有 jks 的副檔名。此類型的金鑰庫可以包含私鑰和憑證,但不能用於儲存秘密金鑰。由於它是 Java 專用的金鑰庫,因此不能在其他程式語言中使用。儲存在 JKS 中的私鑰無法在 Java 中提取。
JCEKS,JCE 金鑰庫(Java 加密擴展金鑰庫)。它是 JKS 的超集,支援更多演算法。它是 Sun 後來新增的增強標準。您可以在 com.sun.crypto.provider.JceKeyStore 中找到此檔案。此金鑰庫的副檔名為 jceks。可以放入 JCEKS 金鑰庫中的項目包括私鑰、秘密金鑰和憑證。此金鑰庫通過使用三重 DES 加密為儲存的私鑰提供更強的保護。
JCEKS 的提供者是 SunJCE,它是在 Java 1.4 中引入的。因此,在 Java 1.4 之前,只能使用 JKS。
PKCS12,這是一種標準的金鑰庫類型,可以在 Java 和其他語言中使用。您可以在 sun.security.pkcs12.PKCS12KeyStore 中找到此金鑰庫的實現。它通常具有 p12 或 pfx 的副檔名。您可以在此類型上儲存私鑰、秘密金鑰和憑證。與 JKS 不同,PKCS12 金鑰庫上的私鑰可以在 Java 中提取。此類型是可移植的,並且可以與其他語言(例如 C、C++ 或 C#)編寫的其他庫一起操作。
目前 Java 中預設的金鑰庫類型是 JKS,即如果您在使用 keytool 建立金鑰庫時未指定 -storetype,則金鑰庫格式將為 JKS。但是,預設的金鑰庫類型將在 Java 9 中更改為 PKCS12,因為它與 JKS 相比具有增強的相容性。您可以在$JRE/lib/security/java.security 檔案中檢查預設的金鑰庫類型:
PKCS11,這是一種硬體金鑰庫類型。它為 Java 庫提供了一個介面,用於連接到硬體金鑰庫裝置,例如 SafeNet 的 Luna、nCipher 或智慧卡。您可以在 sun.security.pkcs11.P11KeyStore 中找到此實現。當您載入金鑰庫時,您不需要使用特定配置建立特定的提供者。此金鑰庫可以儲存私鑰、秘密金鑰和憑證。載入金鑰庫時,將從金鑰庫中檢索項目,然後轉換為軟體項目。
DKS,域金鑰庫是金鑰庫的金鑰庫。它將表示為單個邏輯金鑰庫的金鑰庫集合進行抽象。它本身實際上不是金鑰庫。此新的金鑰庫類型是在Java 8中引入的。有一個新的類別DomainLoadStoreParameter與 DKS 密切相關。
此金鑰庫位於sun.security.provider.DomainKeyStore.java。
Windows-MY,這是在 Windows 上由 Windows 作業系統管理的一種類型的金鑰庫。它儲存用戶端私鑰和憑證,這些憑證可用於執行加密操作,例如簽名驗證、資料加密等。由於它是一種原生金鑰庫,因此 Java 沒有通用的 API 來訪問它。Oracle 提供了一個單獨的 API 來訪問 Windows-MY 金鑰庫——SunMSCAPI。此 API 的提供者類別是sun.security.mscapi.SunMSCAPI。
BKS,BoucyCastle 金鑰庫,是由流行的第三方 Java 加密庫提供者——BouncyCastle提供的金鑰庫格式。它類似於Oracle JDK 提供的JKS。但它支援儲存秘密金鑰、私鑰和憑證。它經常在行動應用程式開發中使用。
在 Java 中,有幾種方法可以處理金鑰庫。編寫 Java 程式碼顯然是一種選擇。除此之外,JDK 還附帶了一個工具,也可以使用,它稱為keytool。
keytool 是一個命令列工具。它可用於建立金鑰庫、產生金鑰、匯入和匯出憑證等。有關 keytool 支援的完整命令列表,您可以參考Oracle keytool 指南。
如果您使用的是 IBM JDK,則可以使用另一個工具,即ikeyman。ikeyman 是一個圖形使用者介面工具,可以提供金鑰庫的直觀檢視。金鑰和憑證也可以使用 ikeyman 建立。它是系統管理員經常使用的工具。
以下是 Java 支援的每個金鑰庫的詳細資訊。