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