管理和保護私鑰是許多應用程式的關鍵方面。Java金鑰庫(JKS) 是一種用於儲存加密金鑰和證書的流行格式。
在本教程中,我們將探討從金鑰庫列出和匯出私鑰的兩種方法:一種使用命令列,另一種使用 Java。
使用命令列
首先,我們使用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-----
|
使用 Java
我們還可以使用 Java 從金鑰庫中列出私鑰:
try (InputStream is = new FileInputStream(<font>"mykeystore.jks")) { // Load the keystore<i> 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。