使用JDK自带keytool生成证书

目录

JDK keytool 的介绍

keytool 常用命令

1. 创建keystore 证书库以及生成密钥对

2. 查看keystore的秘钥

3. 导出公钥证书

4 导出文本证书签名请求文件

 

4.1 证书签发机构签发证书

4.2 本地生成一个cacert 的证书表示有资质的签发机构

4.3 用cacert keystore中的cacert证书的私钥,签发springtest的csr文件

4.4 导入有资质的机构签发的证书到本地证书库,并且覆盖(更新)原来的证书别名

4.5 添加机构的证书为受信任证书到本地证书库

5. 导入证书到keystore

6 删除证书

参考:


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 格式是二进制的文件,操作系统是可以直接按照证书安装

使用JDK自带keytool生成证书

4 导出文本证书签名请求文件

很多时候,我们自己生成的证书是没有经过有资质的结构签发的,所以浏览量访问这些证书的网站时候会有不安全的提示。下面就看看如何让机构帮忙签发证书。

如果想要导出文本格式的证书签名请求文件可以使用以下命令

C:\>keytool -certreq -alias springtest -keystore D:\springtest.jks -storepass springtest -file D:\springtest.csr

这样生成的csr格式的证书签名请求文件

使用JDK自带keytool生成证书

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

本地就生成了签发完的证书

使用JDK自带keytool生成证书

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 查看,已经导入成功

使用JDK自带keytool生成证书

 证书的颁发者是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

上一篇:安卓无法抓取HTTPS问题


下一篇:Android导入Burp Suite证书抓包HTTPS