keytool 隨 JDK 分發,用於管理 KeyStore (密鑰庫) 與 TrustStore (信任庫),支撐 HTTPS、代碼簽名、單點登錄、雙向 TLS 等場景。本文系統梳理核心概念、高頻命令、實戰流程、避坑指南。
| 概念 | 說明 | 文件典型後綴 |
|---|---|---|
| KeyStore | 存儲 私鑰 + 對應證書鏈,用於服務端 SSL / 代碼簽名 | .jks, .keystore, .p12 (PKCS12) |
| TrustStore | 存儲 受信 CA 公鑰證書,用於客戶端驗證服務端證書 | .jks, .truststore, .crt |
| Entry 類型 | PrivateKeyEntry (私鑰+鏈) / trustedCertEntry (單純公鑰證書) | - |
| 別名 | 條目唯一標識,不區分大小寫 | - |
| 格式 | JKS (Java 專有) / PKCS12 (行業標準,推薦跨語言互操作) | - |
keytool -genkeypair \
-alias myapp \
-keyalg RSA \
-keysize 2048 \
-sigalg SHA256withRSA \
-validity 365 \
-keystore myapp.jks \
-storepass changeit \
-keypass changeit \
-dname "CN=myapp.example.com, OU=IT, O=MyCompany, L=Beijing, ST=Beijing, C=CN" \
-ext "SAN=dns:myapp.example.com,dns:localhost,ip:127.0.0.1"
關鍵點:-ext SAN 簽發主體備選名,現代瀏覽器/HTTP 庫強制要求,否則會提示「證書不受信」。
keytool -list -v -keystore myapp.jks -storepass changeit
# 導出二進制 DER
keytool -exportcert -alias myapp -keystore myapp.jks -storepass changeit -file myapp.der
# 導出 Base64 PEM (文本,適合傳輸/查看)
keytool -exportcert -alias myapp -keystore myapp.jks -storepass changeit -rfc -file myapp.pem
keytool -importcert -alias myapp-ca -file ca.pem -keystore truststore.jks -storepass changeit -noprompt
keytool -certreq -alias myapp -keystore myapp.jks -storepass changeit -file myapp.csr
CA 簽發回 myapp.crt 及鏈證書後,導入回原 KeyStore:
# 1. 先導入根/中間 CA (建立信任鏈)
keytool -importcert -alias rootca -file rootca.crt -keystore myapp.jks -storepass changeit -noprompt
keytool -importcert -alias interca -file interca.crt -keystore myapp.jks -storepass changeit -noprompt
# 2. 導入自身簽發證書 (替換自簽)
keytool -importcert -alias myapp -file myapp.crt -keystore myapp.jks -storepass changeit -noprompt
# 修改 KeyStore 整體密碼
keytool -storepasswd -keystore myapp.jks -storepass oldpass -new newpass
# 修改私鑰密碼
keytool -keypasswd -alias myapp -keystore myapp.jks -storepass newpass -keypass oldpass -new newpass
# 修改別名
keytool -changealias -alias old -destalias new -keystore myapp.jks -storepass newpass
# JKS → PKCS12
keytool -importkeystore -srckeystore myapp.jks -srcstoretype JKS \
-destkeystore myapp.p12 -deststoretype PKCS12 \
-srcstorepass changeit -deststorepass changeit
# PKCS12 → JKS (同理對調 src/dest)
# application.yml
server:
port: 8443
ssl:
key-store: classpath:myapp.p12
key-store-type: PKCS12
key-store-password: changeit
key-alias: myapp
server:
ssl:
client-auth: need # 或 want
trust-store: classpath:truststore.p12
trust-store-type: PKCS12
trust-store-password: changeit
客戶端 (如 HttpClient) 需加載 KeyStore (含客戶端私鑰) 與 TrustStore (含服務端 CA)。
-ext SAN=...;.jks/.p12 含私鑰,屬最高機密,嚴禁提交代碼倉庫,納入密管平台管理。Keytool 掌握 生成(-genkeypair)、查看(-list)、導出(-exportcert)、導入(-importcert)、CSR(-certreq)、轉格式(-importkeystore) 六大核心動作,配合 SAN、PKCS12、雙向 TLS 實戰,即可覆蓋 95% Java 安全基建場景。建議團隊沉澱標準化腳本,統一命名、密碼策略、備份流程。