Keytool 工具使用
Keytool
管理私钥仓库(keystore)和与之相关的 X.509 证书链(用以验证与私钥对应的公钥),也可以用来管理其他信任实体
-
keytool 将密钥和证书存储在一个所谓的密钥仓库中,缺省的密钥仓库实现将密钥仓库实现为一个文件,用口令保护私钥
-
在密钥仓库中存在两种不同的类型项 :
-
密钥项(PrivateKeyEntry)
存放极为敏感的加密密钥信息。这种信息以一种受保护的格式存储以防止未授权的访问,通常该密钥为机密密钥,或是伴有用于认证相应公钥用的证书”链”的私钥
-
可信任证书项(TrustCertEntry)
每项包含一个属于个人或团体的公钥证书
-
-
密钥仓库别名(alias)
1、对所有的密钥仓库项(密钥项和可信任证书项)的访问都要通过唯一的别名的进行,别名不区分大小写
2、当用 -genkey 命令来生成密钥对(公钥和私钥)或者用 -import 命令来将证书或证书链加到可信任证书的清单中,以增加一个实体到密钥仓库中,必须指定了一个别名
3、例如使用别名 duke 生成新的密钥对并将公钥用以下命令打包到自签名证书中(参见证书链)
keytool -genkey -alias duke -keypass dukekeypasswd
4、更改 duke de 私钥口令,可用如下命令
keytool -keypasswd -alias duke -keypass dukekeypasswd -new 123456
-
密钥仓库位置
1、每个 keytool 命令都有一个 -keystore 选项,用于指定 keytool 管理的密钥仓库的永久密钥仓库文件名称及其位置。缺省情况下,密钥仓库存储在用户宿主目录下(由系统属性的 “user.home”决定)中名为 .keystore 的文件中
2、当使用 -genkey 或 import 或 identitydb 时,如果像尚不存在的密钥仓库添加数据时就创建一个缺省的密钥仓库
3、如果在 -keystore 选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建
4、如果不指定 -keystore 选项,则将创建一个缺省的密钥仓库 .keystore
命令
使用 “keytool -help” 获取所有可用命令
-
查看 keytool 用法
E:\keytoolTest>keytool -help 密钥和证书管理工具 命令: -certreq 生成证书请求 -changealias 更改条目的别名 -delete 删除条目 -exportcert 导出证书 -genkeypair 生成密钥对 -genseckey 生成密钥 -gencert 根据证书请求生成证书 -importcert 导入证书或证书链 -importpass 导入口令 -importkeystore 从其他密钥库导入一个或所有条目 -keypasswd 更改条目的密钥口令 -list 列出密钥库中的条目 -printcert 打印证书内容 -printcertreq 打印证书请求的内容 -printcrl 打印 CRL 文件的内容 -storepasswd 更改密钥库的存储口令 使用 "keytool -command_name -help" 获取 command_name 的用法
-
根据
keytool -command_name -help
提示,查看每个命令的用法,以 -genkeypair 命令为例E:\keytoolTest>keytool -genkeypair -help keytool -genkeypair [OPTION]... 生成密钥对 选项: -alias <alias> 要处理的条目的别名 -keyalg <keyalg> 密钥算法名称 -keysize <keysize> 密钥位大小 -sigalg <sigalg> 签名算法名称 -destalias <destalias> 目标别名 -dname <dname> 唯一判别名 -startdate <startdate> 证书有效期开始日期/时间 -ext <value> X.509 扩展 -validity <valDays> 有效天数 -keypass <arg> 密钥口令 -keystore <keystore> 密钥库名称 -storepass <arg> 密钥库口令 -storetype <storetype> 密钥库类型 -providername <providername> 提供方名称 -providerclass <providerclass> 提供方类名 -providerarg <arg> 提供方参数 -providerpath <pathlist> 提供方类路径 -v 详细输出 -protected 通过受保护的机制的口令 使用 "keytool -help" 获取所有可用命令
解释 :
-
第 4 行 ,生成密钥对 表示该命令的作用是生成密钥对
-
第 6 行 ,选项表示紧接着必须在 -genkeypair 后面的可选项
-
第 8 行到第 26 行,表示每个选项的作用,以
-alias <alias>
选项为例,在使用生成密钥对时,在 -genkeypair 后面加上选项名 -alias ,紧接着在选项名后面输入选项值,例如 <alias> 替换成 tomcat,,如下所示keytool -genkeypair -alias tomcat ,生成别名为 tomcat 的密钥对
-
如果多个选项时,继续在第 3 步的基础上添加选项名和选项值,例如 :
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 123456 -storetype JKS -keystore tomcat.keystore
以上说明一下:
-keyalg RSA,说明生成的密钥对是 RSA 密钥
-keysize 2048,说明密钥长度为 2048
-sigalg SHA256withRSA,说明使用 SHA256withRSA 签名算法生成证书
-validity 365,有效期 365 天
-keypass 123456,私钥密码(访问私钥使用,一般不建议直接写,要在终端输入)
-storepass 123456,密钥库密码(访问密钥库使用)
-storetype JKS,密钥库类型
-keystore tomcat.keystore,说明私钥和证书都保存在文件 tomcat.keystore
-
执行第 4 步,就生成了一个 tomcat.keystore 文件
E:\keytoolTest>keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 123456 -storetype JKS -keystore tomcat.keystore 您的名字与姓氏是什么? [Unknown]: tomcat 您的组织单位名称是什么? [Unknown]: JNKY 您的组织名称是什么? [Unknown]: JNKY 您所在的城市或区域名称是什么? [Unknown]: GZ 您所在的省/市/自治区名称是什么? [Unknown]: GD 该单位的双字母国家/地区代码是什么? [Unknown]: CN CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN是否正确? [否]: 是
-
生成 tomcat.keystore 之后,可以通过 -list 命令去查看
- 了解 -list 命令用法
E:\keytoolTest>keytool -list -help keytool -list [OPTION]... 列出密钥库中的条目 选项: -rfc 以 RFC 样式输出 -alias <alias> 要处理的条目的别名 -keystore <keystore> 密钥库名称 -storepass <arg> 密钥库口令 -storetype <storetype> 密钥库类型 -providername <providername> 提供方名称 -providerclass <providerclass> 提供方类名 -providerarg <arg> 提供方参数 -providerpath <pathlist> 提供方类路径 -v 详细输出 -protected 通过受保护的机制的口令 使用 "keytool -help" 获取所有可用命令
-
使用命令
keytool -list -keystore tomcat.keystore
E:\keytoolTest>keytool -list -keystore tomcat.keystore 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 tomcat, 2021-3-8, PrivateKeyEntry, 证书指纹 (SHA1): 0D:7F:86:A7:EB:2C:65:F6:62:4F:2C:D5:50:A7:7E:72:37:31:74:B0 Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
当需要详细查看时(其他命令都是可选的)
keytool -list -keystore tomcat.keystore -v(这里输入的输入密钥库口令是第 4 步可选项的 123456( -storepass 123456))
E:\keytoolTest>keytool -list -keystore tomcat.keystore -v 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: tomcat 创建日期: 2021-3-8 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN 发布者: CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN 序列号: 28d0aa93 有效期为 Mon Mar 08 16:51:38 CST 2021 至 Tue Mar 08 16:51:38 CST 2022 证书指纹: MD5: 84:A6:F6:4E:5A:B2:F5:0C:F9:CA:CF:84:5B:9F:C3:DD SHA1: 0D:7F:86:A7:EB:2C:65:F6:62:4F:2C:D5:50:A7:7E:72:37:31:74:B0 SHA256: 29:4A:5F:E9:57:73:58:90:33:6E:84:EE:E3:8C:C0:6E:7D:26:22:14:9C:3A:3A:D7:2F:32:BE:83:31:CD:B8:46 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: EA 21 0E 80 EC 2E D2 A8 CC CA 9B 1A 48 5D 31 95 .!..........H]1. 0010: D7 31 79 E9 .1y. ] ] ******************************************* ******************************************* Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
密码不正确会报错
E:\keytoolTest>keytool -list -keystore tomcat01.keystore -v 输入密钥库口令: keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect java.io.IOException: Keystore was tampered with, or password was incorrect at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:780) at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56) at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70) at java.security.KeyStore.load(KeyStore.java:1445) at sun.security.tools.keytool.Main.doCommands(Main.java:926) at sun.security.tools.keytool.Main.run(Main.java:366) at sun.security.tools.keytool.Main.main(Main.java:359) Caused by: java.security.UnrecoverableKeyException: Password verification failed at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:778) ... 7 more
-
命令扩展
-
生成一个测试使用的 tomcat01.keystore
keytool -genkeypair -alias tomcat01 -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 12345678 -storetype JKS -keystore tomcat01.keystore
-changealias 更改条目的别名命令
-
查看命令用法
E:\keytoolTest>keytool -changealias -help keytool -changealias [OPTION]... 更改条目的别名 选项: -alias <alias> 要处理的条目的别名 -destalias <destalias> 目标别名 -keypass <arg> 密钥口令 -keystore <keystore> 密钥库名称 -storepass <arg> 密钥库口令 -storetype <storetype> 密钥库类型 -providername <providername> 提供方名称 -providerclass <providerclass> 提供方类名 -providerarg <arg> 提供方参数 -providerpath <pathlist> 提供方类路径 -v 详细输出 -protected 通过受保护的机制的口令 使用 "keytool -help" 获取所有可用命令
-
将别名 -alias 为 tomcat01 的条目改为别名 -destalias 为 tomcat02的条目
keytool -changealias -alias tomcat01 -destalias tomcat02 -keystore tomcat01.keystore -v
注意 :
这里的 输入密钥库口令 指的是上面的 12345678 (-storepass 12345678),输入 <tomcat01> 的密钥口令 指的是 123456(-keypass 123456)E:\keytoolTest>keytool -changealias -alias tomcat01 -destalias tomcat02 -keystore tomcat01.keystore -v 输入密钥库口令: 输入 <tomcat01> 的密钥口令 [正在存储tomcat01.keystore] Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat01.keystore -destkeystore tomcat01.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
-
查看是否更改成功
keytool -list -keystore tomcat01.keystore -v ,输入密钥库口令: 指的是上面的 12345678 (-storepass 12345678)
E:\江南科友\keytoolTest>keytool -list -keystore tomcat01.keystore -v 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: tomcat02 创建日期: 2021-3-8 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=tomcat01, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN 发布者: CN=tomcat01, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN 序列号: 6979e2d4 有效期为 Mon Mar 08 17:05:36 CST 2021 至 Tue Mar 08 17:05:36 CST 2022 证书指纹: MD5: 4C:69:A9:22:E8:CB:48:4C:74:DD:59:DE:AF:A7:D5:91 SHA1: 30:DA:94:65:67:EE:9A:7B:BD:BC:0C:E6:5A:EE:F3:68:FF:0B:B6:4C SHA256: E9:6E:BE:04:BF:FB:EF:BC:9E:AD:BD:D2:82:EE:2B:8B:60:60:EE:49:47:2B:10:CF:54:A1:B7:CC:81:11:2F:18 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: C7 46 E6 39 C7 5D 3C 3B 6F AA AB 69 D7 14 BC 20 .F.9.]<;o..i... 0010: A1 CA 0C B9 .... ] ] ******************************************* ******************************************* Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat01.keystore -destkeystore tomcat01.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
注意第 8 行 ,别名: tomcat02,已修改成功
-delete 删除条目命令
-
查看命令用法
E:\keytoolTest>keytool -delete -help keytool -delete [OPTION]... 删除条目 选项: -alias <alias> 要处理的条目的别名 -keystore <keystore> 密钥库名称 -storepass <arg> 密钥库口令 -storetype <storetype> 密钥库类型 -providername <providername> 提供方名称 -providerclass <providerclass> 提供方类名 -providerarg <arg> 提供方参数 -providerpath <pathlist> 提供方类路径 -v 详细输出 -protected 通过受保护的机制的口令 使用 "keytool -help" 获取所有可用命令
-
将别名 -alias 为 tomcat02 的条目删除
keytool -delete -alias tomcat02 -keystore tomcat01.keystore
注意 :
这里的 输入密钥库口令 指的是上面的 12345678 (-storepass 12345678)E:\keytoolTest>keytool -delete -alias tomcat02 -keystore tomcat01.keystore 输入密钥库口令:
-
查看是否更改成功
keytool -list -keystore tomcat01.keystore -v ,输入密钥库口令: 指的是上面的 12345678 (-storepass 12345678)
E:\keytoolTest>keytool -list -keystore tomcat01.keystore -v 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 0 个条目
注意第 6 行 ,原先只有一个条目,删除后显示 0 条目