目录
4.2 本地生成一个cacert 的证书表示有资质的签发机构
4.3 用cacert keystore中的cacert证书的私钥,签发springtest的csr文件
4.4 导入有资质的机构签发的证书到本地证书库,并且覆盖(更新)原来的证书别名
JDK keytool 的介绍
keytool 是JDK 自带的可以生成证书的工具,只要安装JDK 并且配置好相应的环境变量,就可以直接用CMD 命令窗口使用(本文中使用JDK1.8)。
C:\>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 的用法
C:\>
keytool 常用命令
从上面的-help 可以看到我们可以创建,查看,导入,导出,删除证书等各种操作。
简单介绍一下我们常用的几个命令工具。
1. 创建keystore 证书库以及生成密钥对
我们的证书需要有个地方存储,就像DB存储我们的业务数据。keystore就是存储证书的一个仓库。
keytool -genkeypair(keytool -genkeypair)来生成对应的keystore
C:\>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 通过受保护的机制的口令
生成证书库以及秘钥对
C:\>keytool -genkeypair -alias springtest -keyalg RSA -keysize 2048 -keypass springtest -validity 1000 -keystore D:\springtest.jks -storepass springtest
您的名字与姓氏是什么?
[Unknown]: springtest
您的组织单位名称是什么?
[Unknown]: springtest
您的组织名称是什么?
[Unknown]: springtest
您所在的城市或区域名称是什么?
[Unknown]: GZ
您所在的省/市/自治区名称是什么?
[Unknown]: GD
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=springtest, OU=springtest, O=springtest, L=GZ, ST=GD, C=CN是否正确?
[否]: 是
C:\>
2. 查看keystore的秘钥
C:\>keytool -list -v -keystore D:\springtest.jks -storepass springtest
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: springtest
创建日期: 2021-7-10
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=springtest, OU=springtest, O=springtest, L=GZ, ST=GD, C=CN
发布者: CN=springtest, OU=springtest, O=springtest, L=GZ, ST=GD, C=CN
序列号: 4ca69fa1
有效期开始日期: Sat Jul 10 18:51:59 CST 2021, 截止日期: Fri Apr 05 18:51:59 CST 2024
3. 导出公钥证书
C:\>keytool -export -alias springtest -keystore D:\springtest.jks -file D:\springtest.cer -storepass springtest
存储在文件 <D:\springtest.cer> 中的证书
C:\>
这样对应的公钥就导出来到指定的file了。一般我们以cer或者crt后缀表示这个是一个证书(存放导出的公钥的file)
注意:cer,crt 格式是二进制的文件,操作系统是可以直接按照证书安装
4 导出文本证书签名请求文件
很多时候,我们自己生成的证书是没有经过有资质的结构签发的,所以浏览量访问这些证书的网站时候会有不安全的提示。下面就看看如何让机构帮忙签发证书。
如果想要导出文本格式的证书签名请求文件可以使用以下命令
C:\>keytool -certreq -alias springtest -keystore D:\springtest.jks -storepass springtest -file D:\springtest.csr
这样生成的csr格式的证书签名请求文件
4.1 证书签发机构签发证书
我们需要把自己的生成的证书请求文件发送给有资质的签发机构做证书的签发
4.2 本地生成一个cacert 的证书表示有资质的签发机构
C:\>keytool -genkeypair -alias cacert -keyalg RSA -keysize 2048 -keypass cacert -validity 1000 -keystore D:\cacert.jks -storepass cacert
您的名字与姓氏是什么?
[Unknown]: cacert
您的组织单位名称是什么?
[Unknown]: cacert
您的组织名称是什么?
[Unknown]: cacert
您所在的城市或区域名称是什么?
[Unknown]: GZ
您所在的省/市/自治区名称是什么?
[Unknown]: GD
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=cacert, OU=cacert, O=cacert, L=GZ, ST=GD, C=CN是否正确?
[否]: 是
4.3 用cacert keystore中的cacert证书的私钥,签发springtest的csr文件
C:\>keytool -gencert -infile D:\springtest.csr -outfile D:\springtest_cacert.cer -alias cacert -keystore D:\cacert.jks -storepass cacert
本地就生成了签发完的证书
4.4 导入有资质的机构签发的证书到本地证书库,并且覆盖(更新)原来的证书别名
C:\>keytool -import -alias springtest -file D:\springtest_cacert.cer -keystore D:\springtest.jks -storepass springtest
keytool 错误: java.lang.Exception: 无法从回复中建立链
提示“无法从回复中建立链”是因为本地证书库还没有添加有资质的机构的证书为受信任的证书。
4.5 添加机构的证书为受信任证书到本地证书库
C:\>keytool -import -alias cacert -file D:\cacert.cer -keystore D:\springtest.jks -storepass springtest
所有者: CN=cacert, OU=cacert, O=cacert, L=GZ, ST=GD, C=CN
发布者: CN=cacert, OU=cacert, O=cacert, L=GZ, ST=GD, C=CN
序列号: 282c1c65
有效期开始日期: Sat Jul 10 19:45:02 CST 2021, 截止日期: Fri Apr 05 19:45:02 CST 2024
证书指纹:
MD5: D7:B9:D8:4C:87:96:0E:A3:49:F0:B8:65:FE:68:93:E2
SHA1: E9:B4:48:B5:52:4C:3D:A3:82:0B:69:2B:B2:17:D9:CF:90:BA:4C:9C
SHA256: 93:E7:DA:2A:89:F3:E1:78:94:AF:24:CC:12:DC:CB:43:B5:D1:1D:D2:19:28:63:7B:1E:AC:EE:26:D7:8E:9B:C4
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 10 CC C6 6C F1 A1 AA D6 19 A6 4C AF 4D D8 74 7B ...l......L.M.t.
0010: A4 7A 65 34 .ze4
]
]
是否信任此证书? [否]: 是
证书已添加到密钥库中
再次导入机构签发的证书,就显示正确安装了。
C:\>keytool -import -alias springtest -file D:\springtest_cacert.cer -keystore D:\springtest.jks -storepass springtest
证书回复已安装在密钥库中
使用keytool -list 查看,已经导入成功
证书的颁发者是cacert
5 导入证书到keystore
有些时候,需要导入一些第三方的受信任的证书到我们的证书库中。例如:导入CSDN 证书到自己的keystore
C:\>keytool -import -trustcacerts -alias csdn -file D:\CSDN.cer -keystore D:\springtest.jks -storepass springtest
在别名 <digicertglobalrootca> 之下, 证书已经存在于系统范围的 CA 密钥库中
是否仍要将它添加到自己的密钥库? [否]: 是
证书已添加到密钥库中
使用keytool -list 查看,已经导入成功
C:\>keytool -list -v -keystore D:\springtest.jks -storepass springtest
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: csdn
创建日期: 2021-7-10
条目类型: trustedCertEntry
所有者: CN=DigiCert Global Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Global Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: 83be056904246b1a1756ac95991c74a
有效期开始日期: Fri Nov 10 08:00:00 CST 2006, 截止日期: Mon Nov 10 08:00:00 CST 2031
证书指纹:
MD5: 79:E4:A9:84:0D:7D:3A:96:D7:C0:4F:E2:43:4C:89:2E
SHA1: A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
SHA256: 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
签名算法名称: SHA1withRSA
版本: 3
6 删除证书
C:\>keytool -delete -alias springtest-cacert -keystore D:\springtest.jks -storepass springtest
C:\>
以上是工作中使用keytool的一些总结,如有错漏,欢迎大神拍砖
参考:
https://blog.csdn.net/w47_csdn/article/details/87564029