首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Keytool 完全指南:密鑰庫管理、證書鏈操作、HTTPS 部署實戰

     編輯:Java 相關知識

前言:Keytool 是 Java 安全基建的瑞士軍刀

keytool 隨 JDK 分發,用於管理 KeyStore (密鑰庫) 與 TrustStore (信任庫),支撐 HTTPS、代碼簽名、單點登錄、雙向 TLS 等場景。本文系統梳理核心概念、高頻命令、實戰流程、避坑指南。

核心概念速查

概念說明文件典型後綴
KeyStore存儲 私鑰 + 對應證書鏈,用於服務端 SSL / 代碼簽名.jks, .keystore, .p12 (PKCS12)
TrustStore存儲 受信 CA 公鑰證書,用於客戶端驗證服務端證書.jks, .truststore, .crt
Entry 類型PrivateKeyEntry (私鑰+鏈) / trustedCertEntry (單純公鑰證書)-
別名條目唯一標識,不區分大小寫-
格式JKS (Java 專有) / PKCS12 (行業標準,推薦跨語言互操作)-

高頻命令大全

1. 生成密鑰對與自簽證書 (最常用)

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 庫強制要求,否則會提示「證書不受信」。

2. 查看密鑰庫詳情

keytool -list -v -keystore myapp.jks -storepass changeit

3. 導出公鑰證書 (分發給客戶端/導入 TrustStore)

# 導出二進制 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

4. 導入受信證書到 TrustStore

keytool -importcert -alias myapp-ca -file ca.pem -keystore truststore.jks -storepass changeit -noprompt

5. 生成 CSR (證書簽名請求) 送 CA 簽發

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

6. 修改密碼 / 別名

# 修改 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

7. 格式轉換:JKS ↔ PKCS12 (推薦統一 PKCS12)

# JKS → PKCS12
keytool -importkeystore -srckeystore myapp.jks -srcstoretype JKS \
  -destkeystore myapp.p12 -deststoretype PKCS12 \
  -srcstorepass changeit -deststorepass changeit

# PKCS12 → JKS (同理對調 src/dest)

實戰:Spring Boot / Tomcat HTTPS 雙向 TLS 配置

單向 HTTPS (僅服務端證書)

# application.yml
server:
  port: 8443
  ssl:
    key-store: classpath:myapp.p12
    key-store-type: PKCS12
    key-store-password: changeit
    key-alias: myapp

雙向 TLS (客戶端也需證書)

server:
  ssl:
    client-auth: need # 或 want
    trust-store: classpath:truststore.p12
    trust-store-type: PKCS12
    trust-store-password: changeit

客戶端 (如 HttpClient) 需加載 KeyStore (含客戶端私鑰) 與 TrustStore (含服務端 CA)。

避坑指南

  • SAN 缺失:Chrome 58+ 強制要求 SAN,自簽必加 -ext SAN=...;
  • 密碼一致性:KeyStore 密碼、私鑰密碼、TrustStore 密碼建議統一,避免配置錯誤;
  • 證書鏈完整性:導入簽發證書前必須先導入根/中間 CA,否則報「找不到信任鏈」;
  • 時間同步:服務器時間偏差會導致證書驗證失敗 (NotBefore/NotAfter);
  • 生產環境禁用自簽:務必申請正規 CA (Let's Encrypt 免費、DigiCert、GlobalSign 等) 簽發;
  • 備份:.jks/.p12 含私鑰,屬最高機密,嚴禁提交代碼倉庫,納入密管平台管理。

總結

Keytool 掌握 生成(-genkeypair)、查看(-list)、導出(-exportcert)、導入(-importcert)、CSR(-certreq)、轉格式(-importkeystore) 六大核心動作,配合 SAN、PKCS12、雙向 TLS 實戰,即可覆蓋 95% Java 安全基建場景。建議團隊沉澱標準化腳本,統一命名、密碼策略、備份流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved