使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

1、工具

Java自带的工具keytool可以用来生成**证书,也可以查看或删除证书库里的证书。无论是windows还是Linux系统,这个工具都会出现在jdk安装目录的bin文件夹下

下图是在linux环境下,在bin目录下的所有文件:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

2、概念

keytool工具是基于“证书库”来对**进行管理的。“证书库”是一个后缀名为“.keystore”的文件。如下图:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

在**库中,每一条记录就是一份独立的证书,如果使用RSA算法,那这份证书里就会包含有私钥和公钥,如下图:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

keytool工具有很多命令,无论是在windows还是在linux中,你都可以在命令行中输入“keytool”来查看这个工具的用法概述:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

keytool的可用命令并不止上图那些。在本篇后续的使用过程中会逐一介绍。

3、创建证书,并保存入证书

keytool -genkey -alias 你的证书别名 -keyalg **算法 -keystore 证书库文件保存的位置和文件名 -keysize **长度 -validity 证书有效期天数

解释一下几个参数的含义

-genkey:创建证书

-alias:证书的别名。在一个证书库文件中,别名是唯一用来区分多个证书的标识符

-keyalg:**的算法,非对称加密的话就是RSA

-keystore:证书库文件保存的位置和文件名。如果路径写错的话,会出现报错信息。如果在路径下,证书库文件不存在,那么就会创建一个

-keysize:**长度,一般都是1024

-validity:证书的有效期,单位是天。比如36500的话,就是100年

所以完整的一条创建命令可能是这样的:

keytool -genkey -alias mykey -keyalg RSA -keystore C:/mykeystore.keystore -keysize 1024 -validity 36500

然后,keytool会要求你输入证书库的密码,而且是连续输入两遍:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

注意这是“证书库”的密码,而不是你所要生成的证书的密码,这是两个不同的密码。

网络上有些文章建议把证书库的密码与证书密码设置成一样的,其实并不建议这么做。

 

之后,keytool会要求你输入自己的姓名、所在单位/公司/组织的名称、所在城市的名称、所在地区的名称、和2位的国家编码,照着它的引导步骤做就可以了。如果所有信息都输入正确的话,记得在最后输入y,并回车:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

最后,keytool会要求你输入证书的密码,也是连续输入两遍。

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

来看一下完整的过程截图:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

完成后,你就会在自己所设定的目录下找到一个后缀名为“.keystore‘的文件,那个文件就是生成的证书库文件了。

4、查看证书库中的证书

可以使用以下命令来查看一份已存在的证书库中的所有证书

keytool -list -keystore /home/freezingxu/mykeystore.keystore

keytool会要求你输入证书库的密码,注意,是”证书库“的密码,也就是在上述第3步中,首次重复输入两次的那个密码。

然后,keytool就会向你列出这个证书文件里的所有证书,每个证书都是单独的一条记录:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

5、导出公钥文件

使用以下命令来从证书库里的某个证书中导出公钥,并保存成一份公钥文件:

keytool -export -alias mykey -keystore /home/freezingxu/mykeystore.keystore -file mypublickey.cer

解释一下:

-export:用于导出公钥文件的命令参数

-alias:你的证书在证书库中的别名,也是唯一标识

-keystore:完整的证书库文件所在的目录及文件名

-file:导出后的公钥文件所在的完整目录及文件名


keytool仍然会要求你输入证书库的密码,注意是”证书库“的密码

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

特别需要注意的是,私钥是无法从证书库中导出的,因为那样非常不安全。如果你特别需要私钥或是私钥字符串,只能考虑用编程的方式从**库文件中去获取了。

之后,你就会在自己所指定的那个目录下,找到一个cer文件。一般来说你都可以直接双击打开这个文件,其中能够看到你的证书信息以及公钥信息:

使用Java自带的keytool工具生成RSA非对称**证书,并导出公钥文件

 

至此,使用keytool工具生成证书、RSA**对和导出公钥的过程全部完成了。