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 调试了。继续加油!