網域金鑰儲存庫 (DKS) 是一個金鑰儲存庫的金鑰儲存庫。它將多個金鑰儲存庫抽象化為單一邏輯金鑰儲存庫。它本身實際上並不是一個金鑰儲存庫。這種新的金鑰儲存庫類型是在 Java 8 中引入的。有一個新的類別 DomainLoadStoreParameter 與 DKS 密切相關。
若要將不同的金鑰儲存庫載入單一邏輯金鑰儲存庫,需要一些組態。以下是群組不同金鑰儲存庫的組態格式。
domain [ ...] { keystore [ ...] ; ... };
以下是網域 domain 的一個範例組態。
domain app1 { keystore app1-truststore keystoreURI="file:///app1/etc/truststore.jks"; keystore system-truststore keystoreURI="${java.home}/lib/security/cacerts"; keystore app1-keystore keystoreType="PKCS12" keystoreURI="file:///app1/etc/keystore.p12"; };
此組態定義一個網域 app1,其中包含三個金鑰儲存庫。每個包含的金鑰儲存庫 (app1-truststore、system-truststore、app1-keystore) 都指定了 keystoreName。請注意,keystoreName 對於每個項目都必須唯一。
在 keystoreName 之後是一組金鑰儲存庫的屬性。這些屬性包括 keystoreURI、keystoreType、keystoreProviderName、keystorePasswordEnv、entryNameSeparator。屬性名稱不言自明。
載入 DKS 金鑰儲存庫時,會建立一個 DomainLoadStoreParameter 物件並傳遞給 KeyStore.load()。以下是載入 DKS 金鑰儲存庫的範例程式碼片段。
Map<String, KeyStore.ProtectionParameter> PASSWORDS = new HashMap<String, KeyStore.ProtectionParameter>() {{ put("keystore", new KeyStore.PasswordProtection("test123".toCharArray())); put("policy_keystore", new KeyStore.PasswordProtection( "Alias.password".toCharArray())); put("pw_keystore", new KeyStore.PasswordProtection("test12".toCharArray())); put("eckeystore1", new KeyStore.PasswordProtection("password".toCharArray())); put("eckeystore2", new KeyStore.PasswordProtection("password".toCharArray())); put("truststore", new KeyStore.PasswordProtection("changeit".toCharArray())); put("empty", new KeyStore.PasswordProtection("passphrase".toCharArray())); }}; URI config = new URI(CONFIG + "#system"); KeyStore keystore = KeyStore.getInstance("DKS"); keystore.load(new DomainLoadStoreParameter(config, PASSWORDS));
config 是 DKS 金鑰儲存庫的組態路徑,PASSWORDS 是包含組態檔案中定義的金鑰儲存庫的對應密碼的映射。
DKS 也支援載入 InputStream,在此情況下,InputStream 必須是具有 JKS 或 KeyStore.getDefaultType() 金鑰儲存庫類型的單一金鑰儲存庫串流。例如,以下程式碼片段將使用 DKS 載入 JKS 金鑰儲存庫。
char[] PASSWORD = <PASSWORD>; KeyStore keyStore = KeyStore.getInstance("DKS");, keyStore.load(new FileInputStream("keystore.jks"), PASSWORD);
載入金鑰儲存庫後,其他金鑰儲存庫操作與其他金鑰儲存庫類型(例如 JKS)相同。有關建立金鑰和憑證的操作,請閱讀 Java 中不同類型的金鑰儲存庫 -- JKS。