keytool 命令行工具

keytoolJava 开发工具包(JDK) 自带的命令行工具,用来管理密钥库(keystore)证书。它在 %JAVA_HOME%\bin(Windows)或 $JAVA_HOME/bin(Linux、macOS)下,跟 javajavac 一起安装,不需要单独再装一份 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:密钥库类型,JKSPKCS12JCEKS。省略时 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、哈希等

© lizhao all right reserved,powered by Gitbook文件修订时间: 2026-09-01 23:46:43

results matching ""

    No results matching ""