從Java金鑰庫讀取輸出私鑰

banq發表於2024-06-07

管理和保護私鑰是許多應用程式的關鍵方面。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。

相關文章