1. 导入
最近在开发中,笔者遇到了这样的问题:当第三方向我们系统请求pay bill业务时,我们的系统就会报错,而且错误的信息是找不到有效的证书,所以交易就被cancelled了。我们不去深究为什么会有这样的错误,笔者今天主要讲的是关于keytool的相关知识,因为了解这个,你就会知道上面的问题是为什么了。
2. keytool介绍
笔者查找了关于keytool的相关解释,网站上给出的定义是:keytool 是个**和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。其实笔者个人的理解就是,当外面系统要访问我们的系统的时候,就需要给出双方彼此信任的证书,证书里面就包含了外部系统的个人信息,例如:公司名称、公司地址、密码等。而Keytool把钥匙和证书储存到一个keystore,默任实现keystore的是一个文件.它用一个密码保护钥匙.。只有这些信息对应上了,我们的系统才可放行,让外部系统进入到我们的系统内,并进行相关的业务操作。这种情况我们更多见的是在一些支付系统、银行系统中。如图所示:
3. keytool之数据证书
关于keytool相信java开发的程序员并不会陌生,在JDK\Bin的目录下你就可以看到keytool.exe的执行文件,不过不能双击执行。而我们通过dos的命令来创建数字证书,主要就是用keytool.exe的程序了。所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。
4. 证书的概念
一个证书是一个实体的数字签名,还包含这个实体的公共钥匙值.
1) 公共钥匙 :是一个详细的实体的数字关联,并有意让所有想同这个实体发生信任关系的其他实体知道.公共钥匙用来检验签名;
2) 数字签名:是实体信息用实体的私有钥匙签名(加密)后的数据.这条数据可以用这个实体的公共钥匙来检验签名(解密)出实体信息以鉴别实体的身份;
3) 签名:用实体私有钥匙加密某些消息,从而得到加密数据;
4) 私有钥匙:是一些数字,私有和公共钥匙存在所有用公共钥匙加密的系统的钥匙对中.公共钥匙用来加密数据,私有钥匙用来计算签名.公钥加密的消息只能用私钥解密,私钥签名的消息只能用公钥检验签名。
5) 实体:一个实体可以是一个人,一个组织,一个程序,一台计算机,一个商业,一个银行,或其他你想信任的东西.
5. keytool的基本用法
在开始学习keytool的用法,要清楚的是,keytool把钥匙和证书储存到一个keystore。而默认的keystore就是一个文件,它用一个密码保护钥匙。所有的keystore入口(钥匙和信任书入口)是通过唯一的别名。别名是不区分大小写的。例如别名Owen和owen指向同一个keystore入口。为此,我们可以用-import参数加一个证书或证书链到信任证书。
1) 产生一个新的公/私有钥匙对。
语句:keytool -genkey -alias owen -keypass owenkeypasswd
解释:其中owen为别名,owenkeypasswd为owen别名的密码。
2) 修改owen别名的密码。
语句:keytool-keypasswd -alias owen -keypass owenkeypasswd -new newpass
解释:使用-new将旧密码owenkeypasswd改为newpass
3) 检查一个keystore。
语句:keytool -list -v-keystore owen
Enter keystore password:your password(输入密码)
解释:使用-list来查找已经创建好的keystore,在查询中还要输入密码
4) 输出keystore到一个文件。
语句:keytool -export-alias owen -keystore keystore -rfc -file owenkey
系统输出:
Enter keystore password:your password(输入密码)
Certificate stored in file
解释:这可能有点不好解理,我们来看一个具体的例子:
keytool -export -keystore monitor.keystore-alias monitor -file monitor.cer
上面的这句话就是把证书库monitor.keystore中别名为monitor的证书导出到monitor.cer证书中。它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。
5) 输入证书到一个新的truststore
语句:keytool -import -alias dukecert -filetestkey -keystore truststore
Enter keystore password:your new password.(输入truststore新密码)
解释:例如我们要将keystore导入证书中,这里向Java默认的证书cacerts导入Rapa.cert。我们可以这样写:
keytool -import -alias RapaServer -keystorecacerts -file Rapa.cert -keystore cacerts
6) 证书条目的删除
语句:keytool -delete-alias RapaServer -keystore d2aApplet.keystore
解释:将d2aApplet.keystore中的RapaServer这一条证书删除
7) 将证书导出到证书文件
语句:keytool -export -alias myCA -file myCA.cer-keystore myCALib -storepass 123456 –rfc
解释:使用命令从名为myCALib的keystore中,把别名为myCA的证书导出到证书myCA.cer中。其中,-storepass指定keystore的密码,-rfc指定可以查看编码的方式输出,可省略。
8) 通过证书文件查看证书信息
语句:keytool-printcert -file myCA.cer
解释:输入上面的信息将会看到myCA.cer证书的信息
9) **库中证书条目口令的修改
语句:Keytool -keypasswd -alias myCA -keypass654321 -new newpass -storepass 123456 -keystore myCALib
10) 删除**库中的证书条目
语句:keytool -delete-alias myCA -keystore myCALib
11) 把一个证书文件导入到指定的**库
语句:keytool -import-alias myCA -file myCA.cer -keystore truststore
解释:将myCA.cer证书文件导入到truststore **库中,如果没有名为truststore ,将自动创建,并会提示输入keystore的密码。
12) 更改**库的密码
语句:keytool -storepasswd -new 123456 -storepass 789012 -keystore truststore
解释:其中-storepass指定原密码,-new指定新密码
6. keytool实例
在开始实战keytool的用法之前,笔者希望读者可自己创建个文件夹来操作。笔者在E盘下创建了keytool的文件夹,并将目录切换到此文件夹下。同时,我们的操作的一般格式是:
keytool + 操作类型[-genkey,-list-v,-printcert -file,-import -flie,-export -file,-delete,-
keypasswd -new,-storepasswd -new] + 再加上上面的格式.
1) 生成一个别名为myStore的自签名证书,证书的keypair的密码为123456.证书信息为”CN=owen,OU=chinasoft,O=cps,L=sz,ST=gd,C=china”,将证书存储在名为myService.keystore的keystore中(如果没有将自动生成一个),这个keystore的密码为654321.**对生产的算法指定为RSA,有交期为10年。执行命令如下:
keytool -genkey -alias myStore -keystore myService.keystore-keyalg RSA
这时我们就可以在文件夹keytool下,看到myService.keystore的证书库了。
2) 查看证书库myService.keystore的信息,我们可以使用的命令是:
keytool -list -v -keystore myService.keystore
3) 将证书库myService.keystore的myStore证书存储到文件owenfile中。执行命令是:keytool -export -alias myStore -keystore myService.keystore -rfc-file owenfile
所以我们在keytool的文件夹下可以看owenfile的文件。(注:上面的命令也可以这样写:keytool -export -alias myStore -keystore myService.keystore-storepass 123456 -rfc -file owenfile)
4) 将证书myStore导入到owenfile.cer的文件中,生成的是安全证书。执行命令是:
keytool -export -alias myStore -keystore myService.keystore-storepass 123456 -rfc -file owenfile.cer
注:通过(3)(4)的对比,我们可以看到在keytool的文件夹下的两份证书的不同形式。
5) 通过证书文件来查看证书,可以用的命令是:
keytool -printcert -file owenfile.cer
7. 总结
以上就是keytool的相关概念和基本用法了。现在我们应该明白了证书里面是包含什么东西了,无非就是对商家的信息进行加密,然后凭借着加密过的证书来互相之间的识别。在我们CPS的系统中,我们一般会把证书放到接口所在的服务器,因为我们的系统是分布式架构,所以可能对于不同的业务会部署在不同的服务器上。正常情况下,证书的认证就是需要接口的相关方法来识别的,所以我们就是将证书存放在了与接口所部署的服务器上,这样,只要有第三方访问我们的系统,我们就可以先验证他们的证书,只有证书正确了我们才可放行,这也是为了安全而考虑的。
转载地址: https://blog.csdn.net/owen_william/article/details/51147263