keytool使用方法

keytool是jdk自带的一个密钥库管理工具,位于%JAVA_HOME%\bin\keytool.exe,我们可以使用它生成密钥库、管理证书。

jdk版本

jdk17

关于PKCS12和JKS

由于jdk版本的不同,生成的keystore格式也就不同,使用jdk1.8生成的keystore格式为jks,并且生成后会提示:

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore my.keystore -destkeystore my.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

也就是建议将jks密钥库转换为PKCS12格式。

我们用jdk17版本的keytool生成的密钥库类型为PKCS12,而PKCS12只有storepass属性,没有keypass,因此我们单独指定密钥条目的密码,即填入的keypass将不会生效,签名的时候也会无法正常按照我们创建时填写的keypass来读取我们的密钥

keystore

keystore可以理解为一个数据库表,证书就相当于表里保存的记录,也就是说,当keystore存在后,就可以向里面增加、删除、修改证书了,不同的证书有不同的别名,相当于记录的主键,用于区分不同的证书,并且还能导入导出证书。

新建密钥条目

keytool -genkeypair -alias sastest -keyalg RSA -validity 365 -keystore my.keystore -storepass 111111

#功能:
#创建一个别名为sastest的密钥条目(证书),该密钥条目(证书)存放在名为my.keystore的密钥库中,若my.keystore密钥库不存在则创建。

# 参数解释:
# -genkeypair:生成一对非对称密钥((公钥和私钥));
# storepass  keystore文件存储密码,不加这个参数会在后面要求你输入密码
# alias  密钥条目的别名,该别名是公开的
# keyalg  采用公钥算法,默认是DSA,这里采用RSA,如果不指定默认采用DSA
# keysize  密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)
# validity  有效期
# keystore  指定keystore文件储存位置

注意:高版本的jdk生成密钥时,不能单独指定密钥条目的口令,也就是不能再上面的命令中单独指定-keypass选项,例如:

keytool -genkeypair -alias springboot -keypass 123123 -keyalg RSA -validity 365 -keystore my.keystore -storepass 111111

执行时,会忽略keypass,提示如下:

C:\test>keytool -genkeypair -alias springboot -keypass 123123 -keyalg RSA -validity 365 -keystore my.keystore -storepass 111111
警告: PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-keypass值。

默认的密钥条目的口令和密钥库的口令一致,都为111111,PKCS12格式的密钥库目前还没找到修改密钥条目口令的方法

追加密钥条目

keytool -genkeypair -alias springboot -keyalg RSA -validity 365 -keystore my.keystore -storepass 111111

如果指定的是同一个keystore,则新的密钥条目就会追加到该密钥库中。

查看密钥库

keytool -list  -v -keystore my.keystore -storepass 111111

keytool -list -rfc  -keystore my.keystore -storepass 111111
#参数:
#-list 列出证书
#-v 显示详细信息
#-keystore 指定密钥库
#-storepass 指定密钥库的解密密码
#-rfc 以可编码方式打印证书

我们会看到如下内容:

C:\test>keytool -list -v -keystore my.keystore -storepass 111111
密钥库类型: PKCS12
密钥库提供方: SUN

您的密钥库包含 2 个条目

别名: sastest
创建日期: 2022年12月25日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=xie, OU=xie, O=xie, L=urumqi, ST=xj, C=cn
发布者: CN=xie, OU=xie, O=xie, L=urumqi, ST=xj, C=cn
序列号: ac1dc76f8866df60
生效时间: Sun Dec 25 18:45:35 CST 2022, 失效时间: Mon Dec 25 18:45:35 CST 2023
证书指纹:
         SHA1: 30:CE:BB:12:C3:7E:92:BA:3C:28:C6:6B:33:4F:C1:2B:5A:31:F8:09
         SHA256: 9A:FC:B7:EB:10:85:EF:B5:50:2C:7C:65:B3:49:5B:A2:5F:FF:3A:D3:A4:92:EF:B8:FE:CC:E4:B2:D9:F9:ED:9B
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 08 E8 48 AA B9 4D 19 37   FA 88 90 5D 0D 9C 8D 00  ..H..M.7...]....
0010: C9 2B C9 57                                        .+.W
]
]



*******************************************
*******************************************


别名: springboot
创建日期: 2022年12月25日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=tong, OU=tong, O=tong, L=tong, ST=tong, C=cn
发布者: CN=tong, OU=tong, O=tong, L=tong, ST=tong, C=cn
序列号: 557545a707213717
生效时间: Sun Dec 25 18:47:37 CST 2022, 失效时间: Mon Dec 25 18:47:37 CST 2023
证书指纹:
         SHA1: 65:95:D9:BD:67:07:A6:5D:18:DA:7F:67:9B:75:82:B4:19:13:9B:FD
         SHA256: 16:17:C5:5D:AD:AB:B4:5C:EC:16:8C:8E:9F:12:C7:F5:EC:83:1D:6A:5E:10:E5:FC:F2:4B:9F:96:73:1D:E7:F2
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: ED 14 D4 39 93 13 47 66   B6 DF EA 32 D7 BC 88 54  ...9..Gf...2...T
0010: CD CC 8D B6                                        ....
]
]



*******************************************
*******************************************

我们看到:密钥库类型: PKCS12,也就是说这个keytool版本不让我们的库秘钥和别名秘钥不一致

删除密钥条目

keytool -delete -keystore my.keystore -storepass 111111 -alias springboot
#删除密钥库my.keystore中别名为springboot的证书条目

修改keystore口令

注意,此处修改的时keystore的口令,不是某个密钥条目的密码

keytool -storepasswd -keystore my.keystore -storepass 111111 -new 123123

导出密钥条目(证书)

keytool -export -alias sastest -file test.crt  -keystore my.keystore -storepass 111111
或者
keytool -exportcert -alias sastest -file test.crt  -keystore my.keystore -storepass 111111    

导入证书

keytool -import -alias sastest -file test.crt -keystore my.keystore -storepass 111111

如果指定了-alias选项,新导入的密钥条目名称就是指定的名称,否则给一个默认的名字“MyKey”

打印证书

keytool -printcert -file test.crt
posted @ 2022-12-25 21:17  疯狗强尼  阅读(3118)  评论(0编辑  收藏  举报