在 Java 中更改密鑰庫中密鑰的別名
瀏覽人數:67最近更新:
1.概述
在本教程中,我們將學習兩種不同的方法來更改 Java 金鑰庫中金鑰的別名。
2. 設定
首先,讓我們使用keytool
實用程式建立一個包含單一金鑰的測試金鑰庫檔案:
keytool -genkey \
-keyalg rsa \
-alias baeldung \
-dname "cn=my-cn.localhost, ou=Java Devs, o=Baeldung, l=London, s=Greater London, c=GB" \
-keystore my-keystore.jks \
-storepass storepw@1
讓我們確保測試文件已成功建立。我們將使用帶有-i
和-E
選項的grep
命令來突出顯示密鑰庫檔案中的相關資訊:
keytool -list -v -keystore my-keystore.jks -storepass storepw@1 \
| grep -iE "keystore contains|alias|my-cn.localhost"
輸出確認命令成功運行,且金鑰庫檔案包含baeldung
別名:
Your keystore contains 1 entry
Alias name: baeldung
Owner: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
Issuer: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
現在,讓我們看看如何從測試文件中更改現有金鑰的別名。
3. 使用keytool
實用程式更改密鑰的別名
第一種方法涉及使用keytool
實用程式和changealias
選項:
keytool -changealias -alias baeldung -destalias baeldung.com -keystore my-keystore.jks -storepass storepw@1
我們可以使用之前相同的命令檢查結果:
keytool -list -v -keystore my-keystore.jks -storepass storepw@1 \
| grep -iE "keystore contains|alias|my-cn.localhost"
我們可以看到該方法按預期工作,並且新別名現在是baeldung.com
:
Your keystore contains 1 entry
Alias name: baeldung.com
Owner: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
Issuer: CN=my-cn.localhost, OU=Java Devs, O=Baeldung, L=London, ST=Greater London, C=GB
4. 使用 Java 更改鍵的別名
第二種方法是基於 Java KeyStore API。雖然該 API 允許檢查金鑰庫檔案中憑證的名稱和別名,但它不提供直接重命名別名的支援。
因此,我們將使用一種變通方法,在新別名下複製現有鍵。此外,我們還必須刪除初始別名對應的條目.
讓我們看看實際效果:
private static final String KEYSTORE = "my-keystore.jks";
private static final String PWD = "storepw@1";
private static final String OLD_ALIAS = "baeldung";
private static final String NEW_ALIAS = "baeldung.com";
@Test
void whenAliasIsRenamed_thenNewAliasIsCreated() throws Exception {
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(getClass().getResourceAsStream(KEYSTORE), PWD.toCharArray());
assertThat(keystore.containsAlias(OLD_ALIAS)).isTrue();
assertThat(keystore.containsAlias(NEW_ALIAS)).isFalse();
Key key = keystore.getKey(OLD_ALIAS, PWD.toCharArray());
Certificate[] certificateChain = keystore.getCertificateChain(OLD_ALIAS);
keystore.deleteEntry(OLD_ALIAS);
keystore.setKeyEntry(NEW_ALIAS, key, PWD.toCharArray(), certificateChain);
assertThat(keystore.containsAlias(OLD_ALIAS)).isFalse();
assertThat(keystore.containsAlias(NEW_ALIAS)).isTrue();
}
需要注意的是,上一個測試中所做的變更僅應用於金鑰庫的記憶體副本,而不是原始檔案。我們需要將更新的金鑰庫寫入磁碟,才能使這些變更永久生效。
5. 結論
在本文中,我們探討了兩種在 Java 金鑰庫檔案中變更金鑰別名的方法。第一種方法使用keytool
實用程序,這在大多數情況下通常是建議的方法。第二種解決方案是基於 Java 金鑰庫 API,如果需要直接從 Java 程式碼執行更改,則是一個不錯的選擇。
與往常一樣,程式碼可在 GitHub 上取得。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議