列出金鑰庫中的私鑰
瀏覽人數:1,184最近更新:
1. 概述
管理和保護私鑰是許多應用程式的關鍵方面。 Java 金鑰庫 (JKS) 是一種流行的儲存加密金鑰和憑證的格式。
在本教程中,我們將探討兩種從金鑰庫列出和匯出私鑰的方法:一種使用命令列,另一種使用 Java。
2. 使用命令列
首先,我們使用 JDK 提供的keytool實用程式列出金鑰庫中的所有項目,每個項目都包含私密金鑰、憑證和別名:
keytool -list -keystore mykeystore.jks -storepass mypassword
在上面的指令中, mykeystore.jks是我們的金鑰庫檔案名, mypassword是它的密碼。輸出將類似:
Keystore type: PKCS12
Keystore provider: SUN
Your keystore contains 2 entries
Alias name: privatekey1
Creation date: May 29, 2024
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Example, OU=Development, O=Company, L=City, ST=State, C=Country
...
Alias name: privatekey2
Creation date: May 29, 2024
...
接下來,我們將所需的私鑰( -srcalias選項)從 JKS 檔案匯出到 PKCS12 (.p12) 檔案:
keytool -importkeystore -srckeystore mykeystore.jks -destkeystore mykeystore.p12 -srcstoretype JKS -deststoretype PKCS12
-srcalias privatekey1 -srcstorepass mypassword -deststorepass mypassword
然後我們使用openssl命令從 PKCS12 金鑰庫中提取私鑰:
openssl pkcs12 -in mykeystore.p12 -nocerts -nodes -out privatekey.pem -passin pass:mypassword
這會提取 PEM 格式的私鑰。 -nocerts選項告訴openssl不要輸出證書,而-nodes防止私鑰加密。
最後,我們將PEM私鑰轉換為PKCS8格式:
openssl pkcs8 -in privatekey.pem -topk8 -nocrypt -out privatekey-pkcs8.pem
-topk8選項將金鑰轉換為 PKCS8 格式, -nocrypt選項可確保金鑰不會加密。
最終結果將如下所示:
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCymad+US28aEBs
hj5nPJyiPotlyafiJSIKwbOu1rHcUYQukDxzRiKgp/j5dzneWhd7BUKDGLUNPL21
...
k7x6oTwzOTJsWsED69ZOC1E=
-----END PRIVATE KEY-----
3. 使用Java
我們也可以使用 Java 列出金鑰庫中的私鑰:
try (InputStream is = new FileInputStream("mykeystore.jks")) {
// Load the keystore
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
char[] passwordCharArr = "mypassword".toCharArray();
keystore.load(is, passwordCharArr);
for (String alias : Collections.list(keystore.aliases())) {
if (keystore.isKeyEntry(alias)) {
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry(
alias, new KeyStore.PasswordProtection(passwordCharArr));
PrivateKey privateKey = pkEntry.getPrivateKey();
System.out.println("Alias: " + alias);
System.out.println("-----BEGIN PRIVATE KEY-----");
System.out.println(Base64.getMimeEncoder(64, "\n".getBytes())
.encodeToString(privateKey.getEncoded()));
System.out.println("-----END PRIVATE KEY-----");
}
}
}
讓我們分解一下我們的程式碼步驟:
- 從檔案載入金鑰庫。
- 迭代密鑰庫中的所有別名。
- 檢查是否是密鑰條目(包括私鑰)。
- 檢索並列印 PKCS8 格式的私鑰。
此外,讓我們使用 try-with-resources,這樣我們就不必擔心手動關閉InputStream 。
4。
可以使用命令列工具和 Java 程式來列出金鑰庫中的私鑰。命令列方法很簡單,而 Java 允許更靈活地以程式設計方式存取金鑰庫內容。
本文中的範例程式碼可以在 GitHub 上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議