keytool
是一个用于管理密钥和证书的Java命令行工具。它通常用于创建和管理Java Keystores
(JKS
),生成密钥对和证书请求,导入和导出证书,以及查看密钥库的内容。keytool
是Java开发人员和系统管理员在处理SSL/TLS
证书和数字签名时的重要工具。
基本概念
Keystore
: 存储密钥和证书的数据库,可以是JKS
(Java Keystore)、PKCS12
等格式。私钥 (Private Key)
: 用于加密数据或创建数字签名,必须保密。公钥 (Public Key)
: 用于解密数据或验证数字签名,通常与私钥成对存在。证书 (Certificate)
: 证明公钥身份的文件,通常由证书颁发机构 (CA) 签发
常用命令
- 创建一个新的 Keystore 并生成密钥对
- 创建一个包含自签名证书的新的 Java Keystore:
keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -keystore mykeystore.jks -validity 365
keytool -genkeypair -alias <别名> -keyalg RSA -keysize 2048 -validity <有效天数> -keystore <密钥库路径> -storepass <密钥库密码> -keypass <密钥密码> -dname "CN=名字,OU=单位,O=组织,L=城市,ST=省份,C=国家"
-alias
mykey:为密钥对创建一个别名。-keyalg
RSA:使用 RSA 算法生成密钥对。-keysize
2048:指定密钥长度为 2048 位。-keystore
mykeystore.jks:指定生成的 keystore 文件名。-validity
365:证书有效期为 365 天。
- 查看 Keystore 内容
- 列出 keystore 中包含的所有条目(密钥对和证书)(如果需要更详细的输出,可使用
-v
)
- 列出 keystore 中包含的所有条目(密钥对和证书)(如果需要更详细的输出,可使用
keytool -list -keystore mykeystore.jks
#详细输出
keytool -list -v -keystore mykeystore.jks
keytool -list -keystore <密钥库路径> -storepass <密钥库密码>
- 导出公钥证书
- 从 keystore 中导出证书(公钥部分),通常是为了分发给其他人或提交给证书颁发机构 (CA)
keytool -exportcert -alias mykey -keystore mykeystore.jks -file mykey.crt
keytool -exportcert -alias <别名> -keystore <密钥库路径> -file <导出的证书文件路径> -storepass <密钥库密码>
- 导入证书到 Keystore
- 将一个 CA 签发的证书导入到 keystore 中
- 如果导入的证书是信任链的一部分,可能需要先导入根证书和中间证书
- 指定文件中的证书导入到密钥库中,并以指定的别名存储
keytool -importcert -alias mykey -file mykey.crt -keystore mykeystore.jks
keytool -importcert -alias <别名> -file <证书文件路径> -keystore <密钥库路径> -storepass <密钥库密码>
- 生成证书签名请求 (CSR)
- 生成一个证书签名请求,以提交给 CA 颁发正式证书
keytool -certreq -alias mykey -keystore mykeystore.jks -file mykey.csr
- 导入 CA 签名的证书回复
- 在提交 CSR 后,CA 会返回签名的证书,使用以下命令将其导入 keystore
- 需要在导入签名证书之前导入 CA 的根证书和中间证书
keytool -importcert -alias mykey -file mykey_signed.crt -keystore mykeystore.jks
- 更改密钥库密码
- 使用
-storepasswd
命令可以更改密钥库的存储密码
- 使用
keytool -storepasswd -keystore <密钥库路径> -storepass <原始密码> -new <新密码>
- 打印证书信息
- 使用
-printcert
命令可以打印导出的证书信息 - 显示证书的详细信息,包括所有者、签发者、有效期等
- 使用
keytool -printcert -file <证书文件路径>
- 删除 Keystore 中的条目
- 删除 keystore 中的特定条目(密钥或证书)
- 使用
-delete
命令可以从密钥库中删除
keytool -delete -alias mykey -keystore mykeystore.jks
keytool -delete -alias <别名> -keystore <密钥库路径> -storepass <密钥库密码>
- 将
Keystore
转换为其他格式(如PKCS12
)Java
默认的keystore
格式是JKS
,有时需要将其转换为PKCS12
格式,例如用于Apache
或Nginx
-deststoretype
PKCS12:指定目标keystore
类型为PKCS12
keytool -importkeystore -srckeystore mykeystore.jks -destkeystore mykeystore.p12 -deststoretype PKCS12
- 生成自签名证书
-dname
:指定证书的可分辨名称 (DN),包括 CN(Common Name),OU(Organizational Unit),O(Organization),L(Locality),ST(State),C(Country)
keytool -genkeypair -alias selfsigned -keyalg RSA -keysize 2048 -validity 365 -keystore selfsigned.jks -dname "CN=Test, OU=Test, O=Test, L=Test, ST=Test, C=Test"
注意事项
Keystore 密码
:每次操作keystore
都需要提供密码,确保密码安全。备份 Keystore
:Keystore 是存储密钥和证书的容器,非常重要,必须备份以防丢失。证书链
:导入签名证书时,通常还需要导入对应的证书链,包括根证书和中间证书。