keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,它的位置为“%JAVA_HOME%\bin\keytool.exe”。
使用keytool工具时可以使用如下命令(各个JDK版本命令会有差异但会向下兼容,本例使用JDK1.8)
C:\Users\Administrator>keytool
密钥和证书管理工具
命令:
-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来获取。例如:使用keytool –genkeypair –help可以查看genkeypair命令的参数说明:
C:\Users\Administrator>keytool -genkeypair -help
keytool -genkeypair [OPTION]...
生成密钥对
选项:
-alias 要处理的条目的别名
-keyalg 密钥算法名称
-keysize 密钥位大小
-sigalg 签名算法名称
-destalias 目标别名
-dname 唯一判别名
-startdate 证书有效期开始日期/时间
-ext X.509 扩展
-validity 有效天数
-keypass 密钥口令
-keystore 密钥库名称
-storepass 密钥库口令
-storetype 密钥库类型
-providername 提供方名称
-providerclass 提供方类名
-providerarg 提供方参数
-providerpath 提供方类路径
-v 详细输出
-protected 通过受保护的机制的口令
使用 "keytool -help" 获取所有可用命令
有许多命令使用的参数是有默认值的,使用命令时可以不指定,以"-genkeypair"命令为例:
The following examples show the defaults for various option values.
-alias "mykey"
-keyalg
"DSA" (when using -genkeypair)
"DES" (when using -genseckey)
-keysize
2048 (when using -genkeypair and -keyalg is "RSA")
1024 (when using -genkeypair and -keyalg is "DSA")
256 (when using -genkeypair and -keyalg is "EC")
56 (when using -genseckey and -keyalg is "DES")
168 (when using -genseckey and -keyalg is "DESede")
-validity 90
-keystore
-storetype
-file
stdin (if reading)
stdout (if writing)
-protected false
-sigalg
"SHA1withDSA" (when the underlying private key is of type DSA)
"SHA256withRSA" (when the underlying private key is of type RSA)
"SHA256withECDSA" (when the underlying private key is of type EC)
说明:秘钥库是存储一个或多个密钥条目的文件,每个密钥条目应该以一个别名标识,它包含密钥和证书相关信息。
如果使用"keytool -genkeypair"命令生成密钥条目,则会生成一个密钥对(公钥和相关私钥)并将公钥包装到X.509 v3自签名证书中,该证书存储为单个元素证书链,此证书链和私钥存储在以别名标识的密钥库条目中,条目类型为PrivateKeyEntry。
如果使用"keytool -genseckey"命令生成密钥条目,则会生成一个密钥并将其存储在以别名标识的密钥库条目中,条目类型为SecretKeyEntry。
下面以"keytool -genkeypair"命令为例,创建一个新的密钥库并生成一个名为"www.bo.org"的条目。
cmd命令:
keytool -genkeypair -alias www.bo.org -keyalg RSA -keystore d:\keystore\bo.keystore -storetype pkcs12
参数说明:
-genkeypair:生成一对非对称密钥并将公钥包装到X.509 v3自签名证书中;
-alias:指定密钥条目的别名,该别名是公开的;
-keyalg:指定加密算法,本例中的采用通用的RSA加密算法;
-keystore:指定密钥库的路径及名称,若密钥库不存在则创建。若不指定则默认在操作系统的用户目录下生成一个".keystore"的文件;
-storetype:指定密钥库的类型,如果不指定,默认是JKS。如果创建默认类型密钥库,命令行会提示转化为pkcs12类型,所以这里在创建时指定;
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: www.bo.org
您的组织单位名称是什么?
[Unknown]: xinwei
您的组织名称是什么?
[Unknown]: xinwei
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=www.bo.org, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
[否]: y
注意:
1、如果指定的密钥库是第一次创建,则必须在创建时初始化一个条目
2、密钥库的密码至少必须6个字符,可以是纯数字或者字母或者数字和字母的组合等
3、"名字与姓氏"应该是输入域名,而不是我们的个人姓名,其他的可以不填
4、如果创建默认类型(JKS)的密钥库,则可附加"-keypass"参数指定条目的密钥口令,如果没有指定则会在最后一步提示"输入该条目的密钥口令,如果与密钥库口令相同按回车",一般设为与密钥库口令相同。如果创建PKCS12类型的密钥库,则会忽略条目的密钥口令相关参数,因为PKCS12不支持设置密钥库条目密码,默认它与密钥库密码一致。
执行完上述命令后,在操作系统的指定目录下生成了一个"bo.keystore"的文件。
示例:查看名为bo.keystore的密钥库信息
cmd命令:
keytool -list -v -keystore D:\keystore\bo.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: www.bo.org
创建日期: 2019-2-17
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
发布者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
序列号: 53e1769
有效期为 Sun Feb 17 21:42:31 CST 2019 至 Sat May 18 21:42:31 CST 2019
证书指纹:
MD5: D3:4B:91:FE:0D:08:77:D2:AC:8D:65:10:F1:26:30:2F
SHA1: CB:43:4E:B5:03:5B:FC:60:FA:DC:BF:EC:02:E1:FA:C8:9C:53:D4:FE
SHA256: 5D:44:89:D4:FF:1A:70:45:67:2D:3D:14:11:72:61:1D:D3:9A:EA:01:4B:
43:FD:38:F6:A9:38:B8:78:7D:53:3E
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C6 AB A5 21 DC 68 97 79 91 5C D1 0D A3 3A C4 DA ...!.h.y.\...:..
0010: 64 F7 73 3A d.s:
]
]
*******************************************
*******************************************
示例:将密钥库bo.keystore中别名为www.bo.org条目的相关信息以及公钥导出到一个数字证书文件bo.crt中
cmd命令:
keytool -exportcert -keystore d:\keystore\bo.keystore -alias www.bo.org -file d:\keystore\bo.crt
输入密钥库口令:
存储在文件 中的证书
运行结果:在操作系统的指定目录下生成了一个"bo.crt"的文件,注意该证书文件不包含私钥。
示例:将信任证书test.crt以别名"test"导入到密钥库bo.keystore中
cmd命令:
keytool -importcert -file D:\keystore\test.crt -alias test -keystore D:\keystore\bo.keystore
输入密钥库口令:
所有者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: c3cd021
有效期为 Sun Feb 17 21:44:45 CST 2019 至 Sat May 18 21:44:45 CST 2019
证书指纹:
MD5: 61:BF:F3:13:EE:CB:7E:41:9B:1C:CD:C9:AC:34:6F:62
SHA1: E5:C4:5A:22:4A:E2:39:2F:D1:8F:75:9F:4F:D5:94:20:EB:00:A9:A8
SHA256: F2:6C:35:7E:07:F1:F3:7E:13:8D:A3:13:3E:34:6E:D9:D4:BF:FA:53:29:
8F:84:71:27:DC:DB:0A:26:2F:F7:1A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
导入test.crt证书后,查看密钥库bo.keystore信息,新增一个"test"条目:
keytool -list -v -keystore D:\keystore\bo.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: www.bo.org
创建日期: 2019-2-17
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
发布者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
序列号: 53e1769
有效期为 Sun Feb 17 21:42:31 CST 2019 至 Sat May 18 21:42:31 CST 2019
证书指纹:
MD5: D3:4B:91:FE:0D:08:77:D2:AC:8D:65:10:F1:26:30:2F
SHA1: CB:43:4E:B5:03:5B:FC:60:FA:DC:BF:EC:02:E1:FA:C8:9C:53:D4:FE
SHA256: 5D:44:89:D4:FF:1A:70:45:67:2D:3D:14:11:72:61:1D:D3:9A:EA:01:4B:
43:FD:38:F6:A9:38:B8:78:7D:53:3E
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C6 AB A5 21 DC 68 97 79 91 5C D1 0D A3 3A C4 DA ...!.h.y.\...:..
0010: 64 F7 73 3A d.s:
]
]
*******************************************
*******************************************
别名: test
创建日期: 2019-2-17
条目类型: trustedCertEntry
所有者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: c3cd021
有效期为 Sun Feb 17 21:44:45 CST 2019 至 Sat May 18 21:44:45 CST 2019
证书指纹:
MD5: 61:BF:F3:13:EE:CB:7E:41:9B:1C:CD:C9:AC:34:6F:62
SHA1: E5:C4:5A:22:4A:E2:39:2F:D1:8F:75:9F:4F:D5:94:20:EB:00:A9:A8
SHA256: F2:6C:35:7E:07:F1:F3:7E:13:8D:A3:13:3E:34:6E:D9:D4:BF:FA:53:29:
8F:84:71:27:DC:DB:0A:26:2F:F7:1A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
*******************************************
*******************************************
注:test.crt是由另一个密钥库test.keystore生成的证书,将其导入到密钥库bo.keystore时指定的条目别名不能与密钥库中已存在的条目别名重复(导入签发证书除外),一般与导出该证书的密钥库条目别名相同,此时的导入条目会以信任证书的形式保存,条目类型为 trustedCertEntry。
尝试将证书test.crt以别名"www.bo.org"导入到密钥库bo.keystore中,提示操作非法:
keytool -importcert -file D:\keystore\test.crt -alias www.bo.org -keystore D:\keystore\bo.keystore
输入密钥库口令:
keytool 错误: java.lang.Exception: 回复中的公共密钥与密钥库不匹配
示例:打印密钥库bo.keystore中别名为www.bo.org条目导出的证书bo.crt
cmd命令:
keytool -printcert -v -file d:\keystore\bo.crt
所有者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
发布者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
序列号: 53e1769
有效期为 Sun Feb 17 21:42:31 CST 2019 至 Sat May 18 21:42:31 CST 2019
证书指纹:
MD5: D3:4B:91:FE:0D:08:77:D2:AC:8D:65:10:F1:26:30:2F
SHA1: CB:43:4E:B5:03:5B:FC:60:FA:DC:BF:EC:02:E1:FA:C8:9C:53:D4:FE
SHA256: 5D:44:89:D4:FF:1A:70:45:67:2D:3D:14:11:72:61:1D:D3:9A:EA:01:4B:
43:FD:38:F6:A9:38:B8:78:7D:53:3E
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C6 AB A5 21 DC 68 97 79 91 5C D1 0D A3 3A C4 DA ...!.h.y.\...:..
0010: 64 F7 73 3A d.s:
]
]
注:也可以使用 -sslserver ip:port 的参数,直接从网络上打印出某个 ssl server 提供的证书的内容 。
示例:删除密钥库bo.keystore中别名为test的证书条目
cmd命令:
keytool -delete -keystore D:\keystore\bo.keystore -alias test
输入密钥库口令:
这个过程涉及到3个命令:
-certreq、-gencert、-importcert
1)机构A使用certreq命令生成一个证书签名请求文件CSR(certificate sign request)并将其发送给机构B;
2)机构B接收到这个请求后,使用gencert命令签发证书,会生成一个证书或者证书链;
3)机构A接收到响应,使用importcert命令将签发证书导入到keystore中;
示例:将密钥库test.keystore签名的证书导入到密钥库bo.keystore中
首先创建test.keystore密钥库
keytool -genkeypair -alias test -keyalg RSA -keystore d:\keystore\test.keystore -storetype pkcs12
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: test
您的组织单位名称是什么?
[Unknown]: xinwei
您的组织名称是什么?
[Unknown]: xinwei
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
[否]: y
生成证书签名请求文件CSR
keytool -certreq -alias www.bo.org -keystore d:\keystore\bo.keystore -file d:\keystore\cert.csr
输入密钥库口令:
解释:将条目别名为 www.bo.org 的公钥和一些个人信息从密钥库 bo.keystore 文件中导出,作为证书请求文件。
签发证书
keytool -gencert -infile d:\keystore\cert.csr -outfile d:\keystore\test_to_bo.crt -alias test -keystore d:\keystore\test.keystore
输入密钥库口令:
解释:使用密钥库test.keystore中别名为 test 的条目私钥为 cert.csr 签发证书,并保存到 test_to_bo.crt 文件中。
导入签发证书到密钥库
keytool -importcert -file D:\keystore\test_to_bo.crt -alias www.bo.org -keystore D:\keystore\bo.keystore
输入密钥库口令:
keytool 错误: java.lang.Exception: 无法从回复中建立链
解释:将签发证书 test_to_bo.crt 更新到已存在别名 ww.bo.org 的密钥库 bo.keystore 文件中
命令行提示错误"无法从回复中建立链",这是因为在更新被签发证书之前,一定要先将签发证书的机构的信任证书导入到密钥库文件,即将密钥库test.keystore的证书以其相应的别名导入到密钥库bo.keystore中。
导出test.keystore的信任证书:
keytool -exportcert -keystore d:\keystore\test.keystore -alias test -file d:\keystore\test.crt
输入密钥库口令:
存储在文件 中的证书
将信任证书test.crt以其别名"test"导入到密钥库bo.keystore:
keytool -importcert -file D:\keystore\test.crt -alias test -keystore D:\keystore\bo.keystore
输入密钥库口令:
所有者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: c3cd021
有效期为 Sun Feb 17 21:44:45 CST 2019 至 Sat May 18 21:44:45 CST 2019
证书指纹:
MD5: 61:BF:F3:13:EE:CB:7E:41:9B:1C:CD:C9:AC:34:6F:62
SHA1: E5:C4:5A:22:4A:E2:39:2F:D1:8F:75:9F:4F:D5:94:20:EB:00:A9:A8
SHA256: F2:6C:35:7E:07:F1:F3:7E:13:8D:A3:13:3E:34:6E:D9:D4:BF:FA:53:29:
8F:84:71:27:DC:DB:0A:26:2F:F7:1A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
将签发证书test_to_bo.crt以别名"www.bo.org"导入到密钥库bo.keystore:
keytool -importcert -file D:\keystore\test_to_bo.crt -alias www.bo.org -keystore D:\keystore\bo.keystore
输入密钥库口令:
证书回复已安装在密钥库中
此时,密钥库bo.keystore中别名为www.bo.org条目的自签名证书已被更新为由密钥库test.keystore签名的签发证书:
keytool -list -v -keystore D:\keystore\bo.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: www.bo.org
创建日期: 2019-2-17
条目类型: PrivateKeyEntry
证书链长度: 2
证书[1]:
所有者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: 566b0d42
有效期为 Sun Feb 17 22:05:54 CST 2019 至 Sat May 18 22:05:54 CST 2019
证书指纹:
MD5: 50:24:53:0D:9A:42:F7:5E:6E:C6:4D:27:21:B1:D3:4B
SHA1: 28:47:47:87:E3:67:C1:88:85:57:A8:DF:1D:34:04:CC:C7:CC:EE:9C
SHA256: E2:AC:94:A9:77:4B:5B:F1:DE:76:0E:DE:55:42:B4:12:8A:BD:D6:BA:0E:
9E:8B:3E:08:32:B5:A9:1A:80:13:42
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C6 AB A5 21 DC 68 97 79 91 5C D1 0D A3 3A C4 DA ...!.h.y.\...:..
0010: 64 F7 73 3A d.s:
]
]
证书[2]:
所有者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: c3cd021
有效期为 Sun Feb 17 21:44:45 CST 2019 至 Sat May 18 21:44:45 CST 2019
证书指纹:
MD5: 61:BF:F3:13:EE:CB:7E:41:9B:1C:CD:C9:AC:34:6F:62
SHA1: E5:C4:5A:22:4A:E2:39:2F:D1:8F:75:9F:4F:D5:94:20:EB:00:A9:A8
SHA256: F2:6C:35:7E:07:F1:F3:7E:13:8D:A3:13:3E:34:6E:D9:D4:BF:FA:53:29:
8F:84:71:27:DC:DB:0A:26:2F:F7:1A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
*******************************************
*******************************************
别名: test
创建日期: 2019-2-17
条目类型: trustedCertEntry
所有者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=test, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: c3cd021
有效期为 Sun Feb 17 21:44:45 CST 2019 至 Sat May 18 21:44:45 CST 2019
证书指纹:
MD5: 61:BF:F3:13:EE:CB:7E:41:9B:1C:CD:C9:AC:34:6F:62
SHA1: E5:C4:5A:22:4A:E2:39:2F:D1:8F:75:9F:4F:D5:94:20:EB:00:A9:A8
SHA256: F2:6C:35:7E:07:F1:F3:7E:13:8D:A3:13:3E:34:6E:D9:D4:BF:FA:53:29:
8F:84:71:27:DC:DB:0A:26:2F:F7:1A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 52 32 69 80 EF C3 A3 7B FF A8 26 11 79 F5 65 1A R2i.......&.y.e.
0010: 98 56 37 D5 .V7.
]
]
*******************************************
*******************************************
对比最开始生成的密钥库bo.keystore的证书信息可发现,别名为"www.bo.org"条目的证书链已由单个bo.keystore自签名的证书变为2个证书,分别是test.keystore签名的bo.keystore证书、test.keystore的自签名证书。
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/keytool.html
http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
Java安全套接字编程以及 keytool 使用最佳实践
Java制作证书的工具keytool用法总结
Java Security:keytool工具使用说明
用keytool创建秘钥库以及导入导出数字证书等操作