目录
- keytool官方文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html
- keytool参考手册: https://www.chinassl.net/ssltools/keytool-commands.html
一、keytool 简介
1.1 什么是 keytool?
keytool
是 Java 开发工具包 JDK1.4
之后引入的一个命令行工具,用于管理和生成 密钥对、数字证书 以及管理 密钥库。它主要用于安全通信和身份验证,通过使用公钥/私钥对和相关证书实现自我认证。
keytool 将密钥和证书存储在所谓的 “密钥库” 中,这是一种安全的存储设施,可以保护敏感信息免受未经授权的访问。
keytool 命令位置:
%JAVA_HOME%\bin\keytool.exe
1.2 主要功能:
- 生成密钥对: 可以创建新的公钥和私钥对,并将其存储在指定的密钥库。
- 生成证书请求(CSR): 可以生成证书签名请求(Certificate Signing Request),并将其提交给CA(证书办法机构)进行签发。
- 导入和导出证书: 可以从密钥库中导入或导出证书,支持多种格式。
- 查看和操作密钥库: 可以列出密钥库中的所有条目,包括公钥、私钥和证书链等信息。
- 转换密钥库格式: 可以将密钥库从一种格式转换为另一种格式,例如从
PKCS12
转换为Jks
。 - 自签名证书: 可以创建自签名的证书,用于测试和开发环境中的安全通信。
- 证书吊销列表文件: 可以生成证书吊销列表文件,用于跟踪已撤销的证书。
1.3 使用场景
keytool 广泛应用于各种需要证书签名和身份验证的场景,如:
- SSL/TLS 配置、安全电子邮件、Web服务 等等。
它可以帮助开发者轻松管理证书和密钥,确保系统的安全性。
1.4 常用命令
使用 keytool 生成自签名证书:
- 带解释命令:
keytool -genkey -alias test(别名)
-keypass 123123(私钥密码)
-keyalg RSA(算法)
-sigalg sha256withrsa(算法小类)
-keysize 1024(密钥长度)
-validity 365(有效期)
-keystore d:/keystore/test.jks(生成路径)
-storepass 123123(主密码)
- 生成 jks 文件,原始命令:
keytool -genkey -alias test -keypass 123123 -keyalg RSA -sigalg sha256withrsa -keysize 1024 -validity 365 -keystore d:/keystore/test.jks -storepass 123123
- 生成 p12 文件,原始命令:
keytool -genkey -alias 别名 -keypass 密码 -keyalg RSA -keysize 2048 -validity 365 -keystore 文件路径/文件名.p12 -storepass 密码 -deststoretype pkcs12
1.5 默认参数
keytool 命令的默认参数如下:
-alias "mykey"
-keyalg
"DSA" (when using -genkeypair)
"DES" (when using -genseckey)
-keysize
2048 (when using -genkeypair and -keyalg is "RSA")
2048 (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 <the file named .keystore in the user's home directory>
-destkeystore <the file named .keystore in the user's home directory>
-storetype <the value of the "keystore.type" property in the
security properties file, which is returned by the static
getDefaultType method in java.security.KeyStore>
-file
stdin (if reading)
stdout (if writing)
-protected false
二、keytool 用法说明
2.1 基本使用
keytool 的语法如下:
- keytool [选项]
选项如下:
-gencert 根据证书请求生成证书
-genkeypair 生成密钥对(简写-genkey)
-genseckey 生成密钥
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-certreq 生成证书请求
-exportcert 导出证书
-list 列出密钥库中的条目
-printcertreq 打印证书请求的内容
-printcert 打印证书内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令(简写-storepass)
-keypasswd 更改条目的密钥口令
-delete 删除条目
-changealias 更改条目的别名
-help 帮助
使用 "keytool -command_name -help" 获取 command_name 的用法
想要了解某个命令的参数可以使用 keytool -command_name -help
来查看具体用法。例如:
keytool -genkeypair -help
:可以查看 genkeypair 命令的参数说明:
D:\test>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" 获取所有可用命令
keytool 有许多命令使用的参数是有默认值的,使用命令时可以不指定,常见的默认参数如下:
- 密钥算法(
-keyalg
):默认为RSA
。 - 密钥大小(
-keysize
):默认为2048
位。 - 密钥库类型(
-keystore
):默认为JKS
(Java keystore)。 - 密钥库密码(
-storepass
):没有默认值,需要用户输入。 - 密钥密码(
-keypass
):如果未指定,将使用密钥库密码作为密钥密码。 - 密钥有效期(
-validity
):默认为365
天。 - 密钥库文件(
-keystore
):如果未指定,将使用.keystore
文件。
例如:
- 下面是一个创建密钥对的命令,使用了一些默认参数:
keytool -genkeypair -alias example -keyalg RSA -keysize 2048 -validity 365
在这个命令中,-alias
用于指定密钥对的别名,其他参数使用默认值。
2.2 创建密钥库和密钥条目
密钥库
是存储一个或多个密钥条目的文件,每个密钥条目应该以一个别名标识,它包含 密钥 和 证书 相关信息。
有两种方式来生成密钥条目:
- 如果使用
keytool -genkeypair
命令生成密钥条目,则会生成一个密钥对(公钥和相关私钥)并将公钥包装到X.509 v3
自签名证书中,该证书存储为单个元素证书链,此证书链和私钥存储在以别名标识的密钥库条目中,条目类型为PrivateKeyEntry
。 - 如果使用
keytool -genseckey
命令生成密钥条目,则会生成一个密钥并将其存储在以别名标识的密钥库条目中,条目类型为SecretKeyEntry
。
下面以 keytool -genkeypair
命令为例,创建一个新的密钥库,并生成一个名为 www.bo.org 的 密钥条目,命令如下:
keytool -genkeypair -alias www.bo.org -keyalg RSA -keystore d:\keystore\bo.keystore -storetype pkcs12
-genkeypair
:简写-genkey
,生成一对非对称密钥,并将公钥包装到X.509 v3
自签名证书中;-alias
:指定密钥条目的别名,该别名是公开的;-keyalg
:指定加密算法,本例中采用通用的 RSA 加密算法;-keystore
:指定密钥库的路径及名称,若密钥库不存在则创建。若不指定则默认在操作系统的用户目录下生成一个.keystore
的文件;-storetype
:指定密钥库的类型,如果不指定,默认是JKS
。如果创建默认类型密钥库,命令行会提示转化为pkcs12
类型,所以这里在创建时指定。
执行后,会需要填写相关的信息,如下所示:
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: www.bo.org
您的组织单位名称是什么?
[Unknown]: baidu
您的组织名称是什么?
[Unknown]: baidu
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=www.bo.org, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
[否]: y
注意:
- 如果指定的密钥库是 第一次创建,则必须在创建时初始化一个条目。
- 密钥库的 密码至少 6 个字符,可以是纯数字、纯字母、数字和字母的组合等。
名字与姓名
应该是输入域名,而不是我们的个人姓名。- 如果创建默认类型(
JKS
)的密钥库,则可附加-keypass
参数指定条目的密钥口令,如果没有指定则会在最后一步提示输入该条目的密钥口令,如果与密钥库口令相同按回车
,一般设为与密钥库口令相同。- 如果创建
PKCS12
类型的密钥库,则会忽略条目的密钥口令相关参数,因为 PKCS12 不支持设置密钥库条目密码,默认它与密钥库密码一致。
执行完上述命令后,在操作系统的指定目录下生成了一个 “bo.keystore” 的文件。
2.3 查看密钥库信息
例如:查看名为 “bo.keystore” 的密钥库信息。
命令如下:
keytool -list -v -keystore d:\keystore\bo.keystore
执行结果:
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: www.bo.org
创建日期: 2024-8-21
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A 90 0E 23 02 2F D9 44 BC ..8.s:.:..#./.D.
0010: 0A 5C CD 96 .\..
]
]
*******************************************
*******************************************
2.4 导出密钥库条目证书
例如:将密钥库 bo.keystore
中别名为 www.bo.org 条目的相关信息以及公钥导出到一个数字证书文件 bo.crt
中。
命令如下:
keytool -exportcert -keystore d:\keystore\bo.keysotre -alias www.bo.org -file d:\keystore\bo.crt
运行结果:
输入密钥库口令:
存储在文件 <d:\keystore\bo.crt> 中的证书
- 该命令会在操作系统的指定目录下生成一个 “bo.crt” 的文件,注意该证书文件不包含私钥。
2.5 导入信任证书到密钥库
例如:将信任证书 test.crt
以别名 test
导入到密钥库 bo.keystore
中。
命令如下:
keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore
执行结果:
输入密钥库口令:
所有者: CN=Badb, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
发布者: CN=Another Transient CA, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
序列号: ecf921674a
有效期开始日期: Wed Apr 03 07:59:57 CST 2002, 截止日期: Tue Apr 03 06:59:46 CST 2012
证书指纹:
MD5: 12:F1:0E:0E:78:23:D2:05:51:BE:5A:AF:91:C9:4E:19
SHA1: 2C:13:B3:7E:4B:04:DA:AD:7E:78:D9:99:0C:6E:4D:83:C0:72:CB:84
SHA256: 8F:47:C8:66:E0:FC:63:82:4A:E2:69:AA:8F:2A:DB:A6:33:B1:C0:C5:6F:48:58:7A:9C:07:3E:00:77:42:01:8D
签名算法名称: SHA1withDSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 8A 1C 56 30 5A 32 12 7D ..V0Z2..
]
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 80 B4 04 6A CA D1 35 A8 ...j..5.
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
导入 test.crt
证书后,再次查看密钥库 bo.keystore
信息,新增一个 test
条目。
命令如下:
keytool -list -v -keystore d:\keystore\bo.keystore
执行结果:
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: www.bo.org
创建日期: 2024-8-21
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A 90 0E 23 02 2F D9 44 BC ..8.s:.:..#./.D.
0010: 0A 5C CD 96 .\..
]
]
*******************************************
*******************************************
别名: test
创建日期: 2024-8-21
条目类型: trustedCertEntry
所有者: CN=Badb, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
发布者: CN=Another Transient CA, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
序列号: ecf921674a
有效期开始日期: Wed Apr 03 07:59:57 CST 2002, 截止日期: Tue Apr 03 06:59:46 CST 2012
证书指纹:
MD5: 12:F1:0E:0E:78:23:D2:05:51:BE:5A:AF:91:C9:4E:19
SHA1: 2C:13:B3:7E:4B:04:DA:AD:7E:78:D9:99:0C:6E:4D:83:C0:72:CB:84
SHA256: 8F:47:C8:66:E0:FC:63:82:4A:E2:69:AA:8F:2A:DB:A6:33:B1:C0:C5:6F:48:58:7A:9C:07:3E:00:77:42:01:8D
签名算法名称: SHA1withDSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 8A 1C 56 30 5A 32 12 7D ..V0Z2..
]
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 80 B4 04 6A CA D1 35 A8 ...j..5.
]
]
*******************************************
*******************************************
-
test.crt
是由另一个密钥库test.keysotre
生成的证书,将其导入到密钥库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: 回复中的公共密钥与密钥库不匹配
2.6 打印证书内容
例如:打印密钥库 bo.keystore
中别名为 www.bo.org
条目导出的证书 bo.crt
。
命令如下:
keytool -printcert -v -file d:\keystore\bo.crt
执行结果:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A 90 0E 23 02 2F D9 44 BC ..8.s:.:..#./.D.
0010: 0A 5C CD 96 .\..
]
]
补充: 也可以使用
-sslserver ip:port
的参数,直接从网络上打印出某个ssl server
提供的证书内容。
2.7 删除密钥库条目
例如:删除密钥库 bo.keystore
中别名为 test 的证书条目。
命令如下:
keytool -delete -keystore d:\keystore\bo.keystore -alias test
执行结果:
2.8 证书签发与导入
这个过程涉及到 3 个命令:-certreq
、-gencert
、-importcert
。
证书签发过程:
1)机构 A 使用 -certreq
命令生成一个证书签名请求文件 CSR(certificate sign request)
并将其发送给机构 B。
2)机构 B 接收到这个请求后,使用 -gencert
命令签发证书,会生成一个证书或证书链。
3)机构 A 接收到响应后,使用 -importcert
命令将签发证书导入到 keystore
中。
例如:将密钥库 test.keystore
签发的证书导入到 bo.keystore
中。
第一步:-genkeypair 命令,创建 test.keystore
密钥库
命令如下:
keytool -genkeypair -alias test -keyalg RSA -keystore d:\keystore\test.keystore -storetype pkcs12
执行结果:
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: test
您的组织单位名称是什么?
[Unknown]: baidu
您的组织名称是什么?
[Unknown]: baidu
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn是否正确?
[否]: y
第二步:-certreq 命令,生成证书签名请求文件CSR
命令如下:
keytool -certreq -alias www.bo.org -keystore d:\keystore\bo.keystore -file d:\keystore\cert.csr
- 这条命令的作用是:将条目别名为
www.bo.org
的公钥和一些个人信息从密钥库bo.keystore
文件中导出为CSR
文件,作为证书请求文件。
执行结果:
第三步:-gencert 命令,签发证书
命令如下:
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
文件中。
执行结果:
第四步:-importcert 命令,导入签发证书到密钥库
命令如下:
keytool -importcert -file d:\keystore\test_to_bo.crt -alias www.bo.org -keystore d:\keystore\bo.keystore
- 这条命令的作用是:将签发证书
test_to_bo.crt
更新到已存在别名www.bo.org
的密钥库bo.keystore
中。
执行结果:
- 命令行提示错误
无法从回复中建立链
,这是因为 在更新被签发证书之前,一定要先将签发证书的机构的信任证书导入到密钥库文件中,即:将密钥库test.keystore
的证书以相应的别名导入到密钥库bo.keystore
中。
1)导出 test.keystore 的信任证书:
命令如下:
keytool -exportcert -keystore d:\keystore\test.keystore -alias test -file d:\keystore\test.crt
执行结果:
2)将信任证书 test.crt 以其别名 “test” 导入到密钥库 bo.keystore 中:
命令如下:
keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore
执行结果:
输入密钥库口令:
存储在文件 <d:\keystore\test.crt> 中的证书
D:\keystore>keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore
输入密钥库口令:
所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06 8E 3E 86 CF C0 AF 0F 6E ][N9.j...>.....n
0010: 84 85 B2 74 ...t
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
3)将签发证书 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
执行结果:
4)验证证书导入结果:
此时,密钥库 bo.keystore
中别名为 www.bo.org
条目的自签名证书已被更新为由密钥库 test.keystore
签名的签发证书。可以通过之前介绍过的 -list
命令进行查看。
命令如下:
keytool -list -v -keystore d:\keystore\bo.keystore
执行结果:
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: www.bo.org
创建日期: 2024-8-22
条目类型: PrivateKeyEntry
证书链长度: 2
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 38e34d2
有效期开始日期: Wed Aug 21 22:14:04 CST 2024, 截止日期: Tue Nov 19 22:14:04 CST 2024
证书指纹:
MD5: 4E:1B:5A:8A:D0:64:8B:81:CF:D9:0D:92:E0:B8:7E:A4
SHA1: 14:3C:0E:CC:F0:5A:28:2A:CC:FF:33:34:C9:59:E5:C4:9A:6F:B9:3A
SHA256: 9C:41:67:AC:59:AE:81:1A:15:23:5E:39:F1:D6:19:08:A0:3B:E8:8F:EA:C8:7D:07:BF:A4:0E:92:B9:AC:50:B4
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06 8E 3E 86 CF C0 AF 0F 6E ][N9.j...>.....n
0010: 84 85 B2 74 ...t
]
]
#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A 90 0E 23 02 2F D9 44 BC ..8.s:.:..#./.D.
0010: 0A 5C CD 96 .\..
]
]
证书[2]:
所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06 8E 3E 86 CF C0 AF 0F 6E ][N9.j...>.....n
0010: 84 85 B2 74 ...t
]
]
*******************************************
*******************************************
别名: test
创建日期: 2024-8-22
条目类型: trustedCertEntry
所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06 8E 3E 86 CF C0 AF 0F 6E ][N9.j...>.....n
0010: 84 85 B2 74 ...t
]
]
*******************************************
*******************************************
5)验证结果:
- 对比最开始生成的密钥库
bo.keystore
的证书信息可发现,别名为 “www.bo.org” 条目的 证书链已由单个bo.keystore
自签名的证书变为 2 个证书,分别是test.keystore
签名的bo.keystore
证书、test.keystore
的自签名证书。
三、补充
3.1 导出 .p12/.pfx 文件
.p12
和 .pfx
文件为同一类型,没有任何差异,均为 PKCS#12
格式,这是一种跨平台的标准格式,可以包含 私钥、公钥证书,以及 证书链。
- 使用 keytool 的
-importkeystore
命令可以将.jks
或.keystore
文件中的密钥和证书导出到.p12
文件中。
命令如下:
keytool -importkeystore -srckeystore bo.keystore -srcalias www.bo.org -destkeystore bo.p12 -deststoretype pkcs12
-srckeystore
:指定 源密钥库文件的路径;-srcalias
:指定 要导出的密钥别名;-destkeystore
:指定 目标密钥库文件的路径和名称;-deststoretype
:指定 目标密钥库的类型(在这里是PKCS12)。
执行结果:
3.2 -importkeystore 命令
命令如下:
keytool -importkeystore -help
执行结果:
从其他密钥库导入一个或所有条目
选项:
-srckeystore <srckeystore> 源密钥库名称
-destkeystore <destkeystore> 目标密钥库名称
-srcstoretype <srcstoretype> 源密钥库类型
-deststoretype <deststoretype> 目标密钥库类型
-srcstorepass <arg> 源密钥库口令
-deststorepass <arg> 目标密钥库口令
-srcprotected 受保护的源密钥库口令
-srcprovidername <srcprovidername> 源密钥库提供方名称
-destprovidername <destprovidername> 目标密钥库提供方名称
-srcalias <srcalias> 源别名
-destalias <destalias> 目标别名
-srckeypass <arg> 源密钥口令
-destkeypass <arg> 目标密钥口令
-noprompt 不提示
-providerclass <providerclass> 提供方类名
-providerarg <arg> 提供方参数
-providerpath <pathlist> 提供方类路径
-v 详细输出
使用 "keytool -help" 获取所有可用命令
3.3 导出 .pem 文件
命令如下:
# 第1步:导出cer/crt文件
keytool -exportcert -file bo.cer -keystore bo.keystore -alias www.bo.org
# 第2步:
执行结果:
.pem文件内容:
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIEMAdjIzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJj
bjELMAkGA1UECBMCYmoxCzAJBgNVBAcTAmJqMQ4wDAYDVQQKEwViYWlkdTEOMAwG
A1UECxMFYmFpZHUxDTALBgNVBAMTBHRlc3QwHhcNMjQwODIyMTEyNzE3WhcNMjQx
MTIwMTEyNzE3WjBcMQswCQYDVQQGEwJjbjELMAkGA1UECBMCYmoxCzAJBgNVBAcT
AmJqMQ4wDAYDVQQKEwViYWlkdTEOMAwGA1UECxMFYmFpZHUxEzARBgNVBAMTCnd3
dy5iby5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCL+E9DNtAt
WYHzQNhGrYQkqFzHDiyWka5szqMgFfSt9dB8U336YwZBD0DxWzrR0vDSUkFRquV5
qD1k1iwC/rxobhku0Rb1HqrsYXdsUHSQoD3ixCh9xH2LnQcsNfKeL+eNkK9ZjU1V
gsRbpwk4Q7g9j8PwswMNuELPuK96nE+w6JmYUrCR+VlZNAGpexzQME6xrWe0O9lf
VzwvovKFg4LCqKv1DoiZRcNaAtf4y9dYGyBhLkIvM+kdLeQFgKMogwsST9HhG148
i5EdYLA8KLTlWbDDqn3PG1id/UyA/Rh2kSHL2w4Er5cwyuh11Bz31fsfEU5GbR4D
QOw3lfjU4YEbAgMBAAGjQjBAMB8GA1UdIwQYMBaAFE2J8eJn74wQObiJv9iG6KpE
AOZVMB0GA1UdDgQWBBTA5yAHSEN4REiIA1ZeJ0PCesr4WjANBgkqhkiG9w0BAQsF
AAOCAQEACBa042+9RqXW4Mn5Vl2EWVCGkJl7lsRJc/LUQPBsjDlqEbCOA4Ilz5rN
HzO+idbKGBaSUpLG53OllXYODbWOVmKjPy+NrzyGbbEgU22WcdYq5lZgUHMMIvNI
kzm1KVC/BCNY8PsBOLk+pIzdnoQFlD9mYWt32LY6ao/Opuq/TYJ6FkMGrD9ECWau
i6NrgyQHEHIOQg4q189PTQaWbtz3+v3fKEyi6UsHEP7pOun2XSnFlYaa3l7oH4Md
lpi89ugQog2IpuY5TJ61ka+kAajBaVSIeE0/NOXGBlGCF3ptzNRq3vGPro86aPYP
Zefi3motl1RLsGg+CeWhlwWH0d2MwA==
-----END CERTIFICATE-----
3.4 导出私钥 .key文件
keytool
工具无法实现这个操作,需要使用 openssl
工具。
命令如下:
openssl pkcs12 -in bo.p12 -nocerts -nodes -out bo.key -password pass:123456
执行结果:
(注意:这里命令虽然会卡住,但是 .key 文件已经生成好了。)
.key文件内容:
Bag Attributes
friendlyName: www.bo.org
localKeyID: 54 69 6D 65 20 31 37 32 34 38 34 31 35 37 38 35 39 31
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCL+E9DNtAtWYHz
QNhGrYQkqFzHDiyWka5szqMgFfSt9dB8U336YwZBD0DxWzrR0vDSUkFRquV5qD1k
1iwC/rxobhku0Rb1HqrsYXdsUHSQoD3ixCh9xH2LnQcsNfKeL+eNkK9ZjU1VgsRb
pwk4Q7g9j8PwswMNuELPuK96nE+w6JmYUrCR+VlZNAGpexzQME6xrWe0O9lfVzwv
ovKFg4LCqKv1DoiZRcNaAtf4y9dYGyBhLkIvM+kdLeQFgKMogwsST9HhG148i5Ed
YLA8KLTlWbDDqn3PG1id/UyA/Rh2kSHL2w4Er5cwyuh11Bz31fsfEU5GbR4DQOw3
lfjU4YEbAgMBAAECggEAEemWIzDplVQmGD5NL0ZXaeWN8f9zX1WHb+9F2v5UUMrr
gm2g6qEvlLXiBsE5Fs8a+J+EMnJfaaFJMhVijoOREwA8AszJVlc1YojaoqbtM/D9
2n5l/CpgMrTGzTaeNPZGeMxyVFCL/Ax/GoeW23d3JZG3bp9KHcBd9H1bH6LPZAE+
YqPrBybLtUvGdmnmzE1FW1X6qcxI+chg6LQdYIad3Nvz7UPEFh6RTemEfyTNC+Gc
GBvusL0zQHq6GO8rdh8mAFqjqNc9qFlc8F+iuZVbquH6r2jPQrKhwXiwI+HFQXjG
Btf2MWF/UlrfBY6nda7xTLSrtDu26mQ+a700QRqYWQKBgQDzUNSdqGTY0ldHK2M5
jdCdL+EAw/gr/984lcAnN6g4thDMvlmqFq5x2tRAAVnXg6PCZihw8qLnydDNqfv+
M1Zoom4WkEQPn4TpT3a8zDYnomj2ADms/ydX7BHG3YpO5dnstkOWjzcom+iNC8pp
HwsJa2VJgu50G27GL93jDwAahwKBgQCTREc7wCpI6QqVAQcX5+5HW8lZi6kk3r2d
7NE9oBY/qB2h0w6RGzAygDmpQNCGS5wWaWUGqaFGQd/VBGVoJWnMuif/CFnXMA6F
kKqUztefWsJofa321DrNoEtgoG3mP/r0Q6bhPhxCoeGc71f2zhEWZthq7bIm9PDs
AXFU+kNlzQKBgHzRtoC6ZiGkpglohJp92csJSM/vuFw6AvUwPUbhEnclTzD5ZV4Q
DKVzsPa0urYIXfXYGl722gM2UNtwnEknZOiAiyEgGQo6tyBJF4x65j0m39ly/CN3
MWO1QtlVxSH8X/NC/SE7jvxSHtZcehW7Sxol8evoMxN1Dzq0S4uzokX5AoGAFWxz
aG/WNvEgBvk1TPcCpQLnUc2Nd72nnBfdgLePRQdx+B66GcX4xv/8Y3D4ZPEO7fu7
JLL8sTnYFCclkXcP4yaZtvJCD5oAItIe3rMQjzAm5AiUjDnnrA5LqOztz/cyzOIi
ntXoSpE+PxRamZ70wWuIxFV7+0ra2ZqEIDagI2kCgYArKiGNpEyqp3zZ68GAgTKJ
0oRjXvzZSsl5apSGkZy9oPjPEU7F0CS/YalXMmcvAfNUGQWhB1EfG1pgRvwObdBZ
SK8MDXAGvHWQGUlDtyHMyW6YQ15bRfw6xlPz9zepwapPWEca1mC9r6EOiX+aJEbD
ccrxFmPUfkDTjk8Pi9Bvcw==
-----END PRIVATE KEY-----
四、总结
总之,keytool 是一个功能强大且灵活的工具,能够满足大多数与密钥和证书管理相关的开发需求。通过熟练掌握其命令和参数,开发者可以高效地进行安全通信和身份验证操作。
整理完毕,完结撒花~🌻
参考地址:
1.Keytool 实用程序:Java数字证书和密钥管理的核心工具,https://developer.baidu.com/article/details/3310950
2.Java证书工具keytool用法总结,https://blog.csdn.net/w47_csdn/article/details/87564029