keytool 是 JDK 內建的金鑰與憑證管理工具,操作 .keystore / .jks / .p12 等金鑰庫檔案,常用於 HTTPS 憑證部署、Android APP 簽署、JVM 信任存儲維護。
# 建立 RSA 2048 位元金鑰對,存入 keystore.jks
keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 \
-keystore keystore.jks -storepass changeit -keypass changeit \
-dname "CN=example.com, OU=IT, O=MyOrg, L=City, ST=State, C=CN" \
-validity 365
# 產生 CSR
keytool -certreq -alias mykey -keystore keystore.jks -storepass changeit \
-file mykey.csr
# CA 簽署後匯入回覆憑證
keytool -importcert -alias mykey -keystore keystore.jks -storepass changeit \
-file mykey_signed.crt
# 列印金鑰庫內容
keytool -list -v -keystore keystore.jks -storepass changeit
# 匯出憑證 (公鑰)
keytool -exportcert -alias mykey -keystore keystore.jks -storepass changeit \
-rfc -file mykey.pem
# 匯入信任憑證到 cacerts (需管理員權限)
keytool -importcert -alias myca -keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit -file ca.pem -noprompt
# JKS → PKCS12 (跨平台相容性佳)
keytool -importkeystore -srckeystore keystore.jks -srcstorepass changeit \
-destkeystore keystore.p12 -deststoretype PKCS12 -deststorepass changeit
# PKCS12 → JKS
keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass changeit \
-destkeystore keystore.jks -deststorepass changeit
keytool -delete -alias oldkey -keystore keystore.jks -storepass changeit
keytool -storepasswd -keystore keystore.jks -storepass changeit -new newpass
keytool -keypasswd -alias mykey -keystore keystore.jks -storepass newpass -keypass changeit -new newpass
-importcert 根/中繼 CA 到同金鑰庫或 cacerts。| 錯誤 | 原因 | 解決 |
|---|---|---|
| keytool error: java.io.IOException: Keystore was tampered with | 密碼錯誤或檔案損壞 | 確認 -storepass、檔案完整性 |
| Certificate reply does not contain public key for <alias> | CSR 與回覆憑證金鑰不符 | 同一 alias 產生 CSR 並匯入回覆 |
| Failed to establish chain from reply | 缺少中繼/根 CA | 先匯入完整 CA 鏈 |