keytool 命令行工具
keytool 是 Java 开发工具包(JDK) 自带的命令行工具,用来管理密钥库(keystore) 和证书。它在 %JAVA_HOME%\bin(Windows)或 $JAVA_HOME/bin(Linux、macOS)下,跟 java、javac 一起安装,不需要单独再装一份 JRE。
核心作用是管理公钥、私钥对和数字证书:
- 生成密钥对:创建公钥和私钥,并将它们存储在密钥库中。
- 导出、导入证书:将证书从密钥库导出为文件,或从文件导入到密钥库。
- 查看密钥库内容:查看密钥库中的条目(别名、证书指纹、有效期等)。
- 管理信任的证书:将信任的第三方证书添加到信任库(truststore)中。
- 生成证书签名请求(CSR):生成 CSR 文件,用于向证书颁发机构(CA)申请正式 SSL 证书。
典型使用场景:
- 配置 HTTPS:为 Tomcat、Jetty 等 Java Web 服务器生成 SSL 证书。
- Android 应用签名:生成上传密钥(keystore)用于签名 APK、AAB;上架还要配合 Google Play 应用签名。
- 调试 SSL、TLS 连接:查看或导入服务器的证书链。
- 单点登录(SSO):管理 SAML 或 JWT 签名密钥。
安装与环境
keytool 随 JDK 提供。当前应用若是 Spring Boot 3、4,用 JDK 17 或 21(LTS) 里的 keytool 即可。JDK 9 起新建密钥库默认是 PKCS12;JDK 8 默认仍是 JKS。不必再单独装 JRE 8。
把 JDK 的 bin 加进 PATH(下面是 Windows cmd 的临时写法;PowerShell 用 $env:Path += ";C:\path\to\jdk\bin"):
set PATH=%PATH%;"C:\Program Files\Java\jdk-17\bin"
若机器上还留着旧的 JRE 8,也可以用它的 keytool,但默认密钥库类型是 JKS,和本文 PKCS12 示例不一致:
set PATH=%PATH%;"C:\Program Files\Java\jre1.8.0_201\bin"
keytool -version
where keytool
操作命令
# 生成密钥对
keytool -genkeypair -alias springboot -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore springboot-keystore.p12 -validity 3650 -storepass 123456 -dname "CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN" -ext "SAN=dns:localhost,dns:*.izhao.com.cn,ip:127.0.0.1,ip:::1"
参数详解:
-genkeypair:操作命令。这里表示生成密钥对(私钥 + 公钥证书)。旧名-genkey仍然能用,新脚本写-genkeypair。-alias:唯一标识符,后续导出、删除都需要用它指定目标。-keyalg:非对称加密算法,通常选RSA(兼容面最广)或EC(密钥更短,现代栈已普遍支持)。-keysize:密钥长度,RSA 建议 2048 或 4096 位。-storetype:密钥库类型,JKS、PKCS12、JCEKS。省略时 JDK 9 起默认PKCS12。-validity:证书有效期(天)。自签名证书通常设 365 或 3650。-keystore:密钥库文件路径。如果文件不存在,会自动创建。-storepass:密钥库的访问密码。PKCS12 里私钥口令通常必须与库口令相同,省略-keypass时就用这个。-dname:可省略,但建议使用。用于直接指定证书的 DN(专有名称),避免交互式输入。格式:CN=域名或名称, OU=组织单位, O=组织, L=城市, ST=省份, C=国家代码。-ext:向证书添加 X.509 v3 扩展字段,JDK 7 起支持。SAN(Subject Alternative Name)允许一张证书绑定多个身份(域名、IP、电子邮件等)。现代浏览器校验 HTTPS 主机名看的是 SAN,不能只靠 CN。-file:输出、输入文件。-v:详细模式。-rfc:PEM 格式输出。-noprompt:非交互模式。-cacerts(JDK 9+):直接操作 JDK 自带的cacerts信任库,不必再手写路径。
核心命令
keytool 的常用命令覆盖密钥和证书的完整生命周期。没有独立的 -rename,改别名用 -changealias。旧别名 -genkey、-import、-export 仍可用,对应下面的 -genkeypair、-importcert、-exportcert。
| 类别 | 命令 | 用途 |
|---|---|---|
| 密钥生成 | -genkeypair |
生成密钥对(私钥 + 公钥证书) |
-genseckey |
生成对称密钥 | |
| 证书操作 | -certreq |
生成证书签名请求(CSR) |
-exportcert |
导出证书 | |
-importcert |
导入证书或证书链 | |
-printcert |
打印证书内容 | |
-printcertreq |
打印 CSR 内容 | |
-gencert |
根据 CSR 生成证书(CA 功能) | |
| 密钥库管理 | -list |
列出密钥库条目 |
-delete |
删除条目 | |
-changealias |
修改别名 | |
| 密码管理 | -keypasswd |
修改私钥密码(JKS 上库口令与私钥口令可不同;PKCS12 通常必须相同) |
-storepasswd |
修改密钥库密码 | |
-importpass |
把口令存成密钥库里的机密条目 | |
| 导入、导出 | -importkeystore |
导入整个密钥库或转换格式 |
| 其他 | -printcrl |
打印 CRL 文件 |
-showinfo |
显示安全信息(如 -tls) |
|
-version |
显示版本 |
详细说明
-genkeypair
生成非对称密钥对并存储。
keytool -genkeypair -alias springboot -keyalg RSA -keysize 2048 -keystore springboot-keystore.p12
-genseckey
生成对称密钥(如 AES、DES)。JCEKS 专门为此设计;JDK 8 起 PKCS12 也可以存对称密钥。
keytool -genseckey -alias springboot -keyalg AES -keysize 128 -keystore springboot-keystore.jceks -storetype JCEKS
-exportcert
将证书导出为文件(不含私钥)。不写 -rfc 时是 DER 二进制,扩展名写成 .der 或 .crt 都可以,内容一样。
# DER 格式(二进制)
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -file springboot-keystore.der
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -file springboot-keystore.crt
# PEM 格式(文本)
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -rfc -file springboot-keystore.pem
-importcert
导入信任的证书或 CA 签发的证书到密钥库。回复到已有私钥条目时,别名必须与生成密钥对时相同。
keytool -importcert -alias other -keystore springboot-keystore.p12 -storepass changeit -file other.pem -trustcacerts
-certreq
从现有密钥对生成 CSR,提交给 CA 申请正式证书。
CSR(Certificate Signing Request,证书签名请求) 是一份加密申请文件,包含申请者的公钥和身份信息,交给 CA(证书颁发机构) 签发正式证书。
keytool -certreq -alias springboot -keystore springboot-keystore.p12 -file request.csr
-gencert
作为 CA,根据 CSR 签发证书(需要 CA 私钥)。若签发后的证书没有 SAN,在这条命令上再加 -ext "SAN=..."。
keytool -gencert -alias ca -keystore ca-keystore.p12 -storepass changeit -keypass changeit -infile request.csr -outfile cert.crt -validity 365
# -storepass:密钥库密码
# -keypass:指定别名的私钥密码
-importkeystore
导入整个密钥库或转换格式(如 JKS → PKCS12)。
# 从 JKS 导入到 PKCS12
keytool -importkeystore -srckeystore old.jks -srcstoretype JKS -destkeystore new.p12 -deststoretype PKCS12
-list
查看密钥库中的条目的内容。
# 简要列表
keytool -list -keystore springboot-keystore.p12 -storepass 123456
# 详细列表(含证书指纹)
keytool -list -v -keystore springboot-keystore.p12 -storepass 123456
# 只查看特定别名
keytool -list -v -keystore springboot-keystore.p12 -storepass 123456 -alias springboot
-delete
从密钥库中删除指定别名。
keytool -delete -alias springboot -keystore springboot-keystore.p12
-changealias
更改密钥库中条目的别名。
keytool -changealias -alias springboot -destalias spring-prod -keystore springboot-keystore.p12
-storepasswd
更改密钥库密码。
keytool -storepasswd -keystore springboot-keystore.p12 -storepass oldpass -new newpass
-keypasswd
更改指定别名的私钥密码。
keytool -keypasswd -alias springboot -keystore springboot-keystore.p12 -keypass oldpass -new newpass
-importpass
将口令作为机密条目存进密钥库(交互输入口令),不是 -genseckey 那种对称密钥。
keytool -importpass -alias dbpassword -keystore springboot-keystore.p12 -storepass changeit
-printcert
查看证书文件内容(无需导入)。
keytool -printcert -file cert.crt
-printcertreq
查看 CSR 文件的详细信息。
keytool -printcertreq -file request.csr
-printcrl
打印 CRL 文件,查看证书吊销列表。
keytool -printcrl -file crl.der
-showinfo
显示 Java 安全相关的系统信息。
keytool -showinfo -tls
-version
显示 keytool 版本信息。
keytool -version
使用示例
申请 CA 签名证书(生产环境)
# 生成 CA 的密钥对(自签名证书)
keytool -genkeypair -alias ca -keyalg RSA -keysize 2048 -keystore ca-keystore.p12 -storetype PKCS12 -storepass changeit -validity 3650 -dname "CN=My Root CA, OU=Security, O=MyCompany, C=CN" -ext "BasicConstraints=ca:true,pathlen:3" -ext "KeyUsage=keyCertSign,cRLSign"
# 导出 CA 证书(供后续导入)
keytool -exportcert -alias ca -keystore ca-keystore.p12 -storepass changeit -rfc -file ca.crt
关键点:BasicConstraints=ca:true 表示是一个 CA 证书;pathlen:3 表示最多可以签发 3 级下级 CA。
# 生成生产环境密钥对和 CSR
keytool -genkeypair -alias prod -keyalg RSA -keysize 2048 -keystore prod.p12 -storetype PKCS12 -storepass changeit -dname "CN=www.example.com, OU=IT, O=MyCompany, L=City, ST=State, C=CN" -ext "SAN=dns:www.example.com,dns:example.com"
keytool -certreq -alias prod -keystore prod.p12 -storepass changeit -file prod.csr
# CA 签发证书
keytool -gencert -alias ca -keystore ca-keystore.p12 -storepass changeit -infile prod.csr -outfile prod.crt -validity 365
# 导入证书链到 prod.p12
# 先导入 CA 证书(作为信任锚)
keytool -importcert -alias ca -keystore prod.p12 -storepass changeit -file ca.crt -trustcacerts
# 导入 CA 签发的服务器证书(覆盖自签名,别名必须是 prod)
keytool -importcert -alias prod -keystore prod.p12 -storepass changeit -file prod.crt -trustcacerts
# 验证结果
keytool -list -v -keystore prod.p12 -storepass changeit
keytool -list -v -alias prod -keystore prod.p12 -storepass changeit | grep "Certificate chain length"
# 应该输出: Certificate chain length: 2
管理信任库
# 创建信任库并导入 CA 证书
keytool -importcert -alias digicert -file digicert.crt -keystore truststore.p12
# 查看信任库
keytool -list -v -keystore truststore.p12
# 删除不需要的 CA
keytool -delete -alias expired-ca -keystore truststore.p12
密钥库格式转换
# JKS → PKCS12
keytool -importkeystore -srckeystore old.jks -srcstoretype JKS -destkeystore new.p12 -deststoretype PKCS12 -deststorepass newpass
# PKCS12 → JKS
keytool -importkeystore -srckeystore source.p12 -srcstoretype PKCS12 -destkeystore dest.jks -deststoretype JKS -deststorepass newpass
密钥库和证书
密钥库
密钥库(Keystore) 是公钥基础设施(PKI)中的一个加密存储容器,用于安全管理加密材料。
密钥库包括:
- 私钥(Private Key)
- 证书链(Certificate Chain)
- 对称密钥(Symmetric Key) - 取决于密钥库类型
- 信任锚(Trust Anchor) - 受信任的 CA 证书
关系示意图:
mykeystore.jks
├── 别名: tomcat-https
│ ├── 私钥 (RSA 2048)
│ └── 证书链 (自签名证书)
│ ├── 服务器证书 (公钥 + 域名信息)
│ ├── 中间CA证书
│ └── 根CA证书
├── 别名: android-release
│ ├── 私钥 (RSA 4096)
│ └── 证书链 (自签名证书)
├── 别名: client-auth
│ ├── 私钥 (EC)
│ └── 证书链 (CA 签发证书)
└── 别名: trusted-ca (信任证书条目,无私钥)
└── 根CA证书
注意: 一个密钥库可以存储多个密钥对(私钥 + 证书链),每个密钥对通过唯一的别名(alias) 区分。可以根据不同的别名导出对应的证书。
数字证书
数字证书(又称公钥证书,Public Key Certificate)是遵循 X.509 标准的一种数字凭证,它将公钥与身份信息进行数字绑定,并由证书颁发机构(CA,Certificate Authority) 进行数字签名,从而提供可验证的信任基础。
一个 X.509 证书包含以下关键字段:
证书
├── 版本号 (Version)
├── 序列号 (Serial Number)
├── 签名算法 (Signature Algorithm)
├── 颁发者 (Issuer) - 谁签发的
├── 有效期 (Validity)
│ ├── 起始时间 (Not Before)
│ └── 截止时间 (Not After)
├── 主题 (Subject) - 证书拥有者
├── 公钥信息 (Subject Public Key Info)
│ ├── 算法 (RSA/EC)
│ └── 公钥值
├── 扩展字段 (Extensions)
│ ├── 使用者可选名称 (SAN) - 域名/IP
│ ├── 密钥用法 (Key Usage)
│ └── 扩展密钥用法 (Extended Key Usage)
└── 签名 (Signature) - CA 的签名
密钥库的格式
PKCS12(强烈推荐)
Public-Key Cryptography Standards #12,标准格式(JDK 9 及之后新建密钥库的默认格式)。
文件扩展名:.p12 或 .pfx。
特点:
- 跨平台兼容(OpenSSL、.NET、Python 等都支持)
- 可同时存储私钥、证书、对称密钥(JDK 8 起)
- 支持更安全的加密算法
JKS
Java KeyStore,JDK 8 及之前的默认格式。JDK 9 起即使文件名叫 .jks,不写 -storetype JKS 时新建的仍是 PKCS12。
文件扩展名:.jks。
特点:
- Java 专有格式,不兼容其他语言、工具
- 只能存储私钥条目和信任证书条目
- 密钥库密码和私钥密码可以不同
- 不支持存储对称密钥(如 AES 密钥)
JCEKS
Java Cryptography Extension KeyStore,扩展格式(JKS 的增强版)。
较少使用,通常只在需要存储对称密钥时使用。
文件扩展名:.jceks
特点:
- 支持存储对称密钥(如 DES、AES 密钥)
- 使用更强的加密算法保护密钥库
BKS
Bouncy Castle KeyStore,第三方格式(由 Bouncy Castle 加密库提供)。
文件扩展名:.bks。
特点:
- 常用于早期 Android 的信任库
- 支持多种加密算法
- 需要引入 Bouncy Castle 依赖
证书的格式
数字证书遵循 X.509 标准(ITU-T 定义的公钥基础设施标准)。
PEM
Privacy Enhanced Mail,Base64 编码的 ASCII 文本。
扩展名:.pem、.crt、.cer。
优点:纯文本,便于查看、复制、邮件传输。
缺点:文件较大。
DER
Distinguished Encoding Rules,二进制格式。
扩展名:.der、.crt。
优点:文件小,解析快。
缺点:不可读,不适合文本传输。
PKCS#7
Public-Key Cryptography Standards #7,可包含一个或多个证书(证书链)。
扩展名:.p7b、.p7c
特点:不含私钥,常用于证书链分发。
PKCS#12
与密钥库格式相同,二进制,可包含私钥 + 证书链。
扩展名:.p12、.pfx。
特点:常用于 Windows 系统导出证书。
密钥对和证书管理
密钥对管理
生成密钥对是创建自签名证书或生成内部测试证书最常用的功能。它会在密钥库中生成一对公钥和私钥,并将它们与一个 X.509 证书关联起来。
# 生成密钥对
keytool -genkeypair -alias springboot -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore springboot-keystore.p12 -validity 3650 -storepass 123456 -dname "CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN" -ext "SAN=dns:localhost,dns:*.izhao.com.cn,ip:127.0.0.1,ip:::1"
# 查看密钥库
keytool -list -v -keystore springboot-keystore.p12 -storepass 123456
keytool -list -v -keystore springboot-keystore.p12 -storepass 123456 -alias springboot
别名: springboot
创建日期: 2026年4月10日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN
发布者: CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN
序列号: 1114a46eede1eea2
生效时间: Fri Apr 10 22:17:12 CST 2026, 失效时间: Mon Apr 07 22:17:12 CST 2036
证书指纹:
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
证书管理
导出证书
# DER 格式(二进制)
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -file springboot-keystore.der
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -file springboot-keystore.crt
# PEM 格式(文本)
keytool -exportcert -alias springboot -keystore springboot-keystore.p12 -storepass 123456 -rfc -file springboot-keystore.pem
导入证书
keytool -importcert -alias other -keystore springboot-keystore.p12 -storepass changeit -file other.pem -trustcacerts
查看证书
keytool -printcert -file springboot-keystore.der
keytool -printcert -file springboot-keystore.crt
keytool -printcert -file springboot-keystore.pem
# 查看密钥库中的证书
keytool -list -v -alias springboot -keystore springboot-keystore.p12 -storepass 123456
# keytool -printcert -file springboot-keystore.pem
所有者: CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN
发布者: CN=localhost, OU=lizhao, O=lizhao, L=HZ, ST=ZJ, C=CN
序列号: 1114a46eede1eea2
生效时间: Fri Apr 10 22:17:12 CST 2026, 失效时间: Mon Apr 07 22:17:12 CST 2036
证书指纹:
SHA1:
SHA256:
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
查看 MD5 指纹
较新的 JDK 里 keytool -list、-printcert 不再打印 MD5。MD5 碰撞早已公开,日常核对证书用 SHA-256。只有对照旧系统上的 MD5 指纹时,才用 OpenSSL:
keytool -exportcert -keystore springboot-keystore.p12 -storepass 123456 -alias springboot -rfc | openssl x509 -noout -fingerprint -md5
openssl pkcs12 -in springboot-keystore.p12 -passin pass:123456 -nokeys -clcerts | openssl x509 -noout -fingerprint -md5
openssl x509 -in springboot-keystore.pem -noout -fingerprint -md5
openssl x509 -in springboot-keystore.der -inform DER -noout -fingerprint -md5
OpenSSL 3 若提示 MD5 不受支持,需要启用 legacy provider 后再算指纹。
openssl
OpenSSL 是一个开源的加密库和工具集,提供了 SSL、TLS 协议的完整实现,以及各种密码学功能。
openssl 包含功能:
- 生成 RSA、EC、EdDSA 密钥对
- 创建 CSR(证书签名请求)
- 签发自签名证书或作为 CA 签发证书
- 转换证书格式(PEM、DER、PKCS12)
- 验证证书链
- 测试 SSL、TLS 连接
- 加密、解密文件
- 计算哈希值(MD5、SHA256)
- ... 等等 100+ 种功能
keytool 和 OpenSSL 核心区别:
| 维度 | keytool | OpenSSL |
|---|---|---|
| 开发者 | Oracle(Java 官方) | 开源社区(OpenSSL 项目) |
| 平台 | 需要 JDK(旧版也可随 JRE) | 独立可执行文件 |
| 核心用途 | Java 密钥库管理 | 通用密码学、证书操作 |
| 默认格式 | JDK 9+ 为 PKCS12;JDK 8 为 JKS | PEM(最通用) |
| 功能广度 | 仅证书、密钥库 | 加密、解密、TLS、哈希等 |