1. 概述

本文将带你快速掌握 Java 自带的 keytool 命令行工具。我们会演示如何使用它生成自签名证书,并查看证书和密钥库(keystore)中的详细信息。

✅ 适用场景:开发调试、本地 HTTPS 配置、服务间安全通信
❌ 不推荐:直接用于生产环境(除非你清楚风险)


2. 什么是 keytool?

keytool 是 JDK 自带的安全工具,用于 管理密钥和证书,并将它们存储在 密钥库(keystore) 中。它是 Java 安全体系中非常基础但关键的一环。

主要功能包括:

  • ✅ 生成密钥对(公钥 + 私钥)
  • ✅ 创建自签名证书
  • ✅ 查看、导出、删除证书
  • ✅ 管理密钥库条目(alias、密码等)

🔗 官方文档:keytool - Oracle JDK 11

我们接下来会用几个高频命令带你实战。


3. 生成自签名证书

在本地开发中,我们常需要一个 HTTPS 服务,比如 Spring Boot 启用 SSL。这时候就可以用 keytool 生成一个临时的自签名证书。

命令格式

keytool -genkeypair \
  -alias <alias> \
  -keypass <keypass> \
  -validity <validity> \
  -storepass <storepass>

参数说明:

参数 说明
-alias 证书别名,相当于一个“名字”,比如 myapp-dev
-keypass 私钥密码,访问私钥时需要
-validity 证书有效期(天数),如 365 表示一年
-storepass 密钥库密码,如果密钥库不存在会自动创建

实际示例

我们生成一个名为 cert1 的证书,有效期 365 天,私钥密码 pass123,密钥库密码 stpass123

keytool -genkeypair \
  -alias cert1 \
  -keypass pass123 \
  -validity 365 \
  -storepass stpass123

执行后,会提示你输入一些组织信息(X.500 DN):

What is your first and last name?
  [Unknown]:  Zhang San
What is the name of your organizational unit?
  [Unknown]:  Dev Team
What is the name of your organization?
  [Unknown]:  MyCompany
What is the name of your City or Locality?
  [Unknown]:  Beijing
What is the name of your State or Province?
  [Unknown]:  Beijing
What is the two-letter country code for this unit?
  [Unknown]:  CN
Is CN=Zhang San, OU=Dev Team, O=MyCompany, L=Beijing, ST=Beijing, C=CN correct?
  [no]:  yes

⚠️ 安全提醒
生产环境中 不要 在命令行直接写 -keypass-storepass,容易被 ps 或历史记录泄露。建议省略参数,让系统交互式输入。


4. 查看密钥库中的证书

生成完证书后,我们可以用 -list 命令查看当前密钥库内容。

查看所有证书

keytool -list -storepass stpass123

输出示例:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert1, 02-Apr-2025, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 0B:3F:98:2E:A4:F7:33:6E:C4:2E:29:72:A7:17:E0:F5:22:45:08:2F

查看指定证书的详细信息

加上 -v(verbose)和 -alias 可以看到完整信息:

keytool -list -v -alias cert1 -storepass stpass123

输出示例:

Alias name: cert1
Creation date: 02-Apr-2025
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Zhang San, OU=Dev Team, O=MyCompany, L=Beijing, ST=Beijing, C=CN
Issuer: CN=Zhang San, OU=Dev Team, O=MyCompany, L=Beijing, ST=Beijing, C=CN
Serial number: 60a8b2c1
Valid from: Wed Apr 02 10:30:00 CST 2025 until: Thu Apr 02 10:30:00 CST 2026
Certificate fingerprints:
     MD5:  16:F8:9B:DF:2C:2F:31:F0:85:9C:70:C3:56:66:59:46
     SHA1: 0B:3F:98:2E:A4:F7:33:6E:C4:2E:29:72:A7:17:E0:F5:22:45:08:2F
     SHA256: 8C:B0:39:9F:A4:43:E2:D1:57:4A:6A:97:E9:B1:51:38:82:0F:07:F6:9E:CE:A9:AB:2E:92:52:7A:7E:98:2D:CA
Signature algorithm name: SHA256withDSA
Subject Public Key Algorithm: 2048-bit DSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A1 3E DD 9A FB C0 9F 5D   B5 BE 2E EC E2 87 CD 45  .>.....].......E
0010: FE 0B D7 55                                        ...U
]
]

📌 这些信息在排查 SSL 握手失败、证书不信任等问题时非常有用。


5. 其他常用操作

keytool 还支持不少实用功能,以下是一些高频命令。

删除证书

keytool -delete -alias cert1 -storepass stpass123

修改证书别名

keytool -changealias \
  -alias cert1 \
  -destalias cert-dev \
  -keypass pass123 \
  -storepass stpass123

获取帮助

任何时候忘了命令,直接打:

keytool -help

会列出所有支持的操作和参数,简单粗暴但有效。


6. 总结

keytool 虽然界面原始,但在 Java 安全体系中仍是不可或缺的工具。掌握以下几个核心命令,基本能应付 90% 的本地开发需求:

  • -genkeypair:生成密钥对和自签名证书
  • -list:查看密钥库内容
  • -delete:删除条目
  • -changealias:修改别名

📌 建议
开发时可以手动生成一个 dev.keystore,配置到项目中,避免每次启动都报证书错误。生产环境则建议使用正式 CA 签发的证书。

📎 默认密钥库路径:~/.keystore(用户主目录下)
📎 常用格式:JKS(Java KeyStore),Java 8 及以前主流;Java 9+ 推荐使用 PKCS12(更标准)

搞定这些,你已经比 80% 的人更懂 Java HTTPS 调试了。继续加油!


原始标题:Introduction to keytool