keytool制作CA根证书以及颁发二级证书

keytool是jdk自带的一款ssl管理工具,jdk6和jdk7的keytool命令有些不同,jdk7的兼容jdk6的,这里用的是jdk7下的keytool。搞了两天,遇到各种问题,甚是艰难啊

[root@localhost ~]# keytool -help
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

这是支持的命令,可以使用 keytool -command_name -help获得子命令的用法,如 keytool -genkeypair -help.
生成自签名的证书

[root@localhost ~]# keytool -genkeypair -alias rootca -keyalg RSA
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  xx认证中心
您的组织单位名称是什么?
  [Unknown]:  xx认证中心
您的组织名称是什么?
  [Unknown]:  xxrenz^H^H^H^[[D
您所在的城市或区域名称是什么?
  [Unknown]:  zz
您所在的省/市/自治区名称是什么?
  [Unknown]:  gd
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN是否正确?
  [否]:  Y

输入 <rootca> 的密钥口令
    (如果和密钥库口令相同, 按回车):  
[root@localhost ~]# 
 alias是别名,就是给某某证书取个名字,可以随便写,可以用changealias命令修改
keyalg是加密算法,有DSA,RSA,默认是DSA,因为DSA只能用于加密,不能用户证书签名,所以这里必须指定使用RSA算法

这里有两个密码:密钥库密码和密钥密码,密钥库是存储密钥的地方,他有密码;只有知道这个密码才可以访问这个密钥库;密钥密码用于生产密钥。

如果密钥库不存在,则会使用输入的密码创建一个密钥库。密钥密码可以和密钥库密码一样。

因为我是用的tomcat做实验,这里有点问题,密钥库密码和密钥密码不一致会导致tomcat启动不了,报错提示密码错误(canot recover key),不知道是不是tomcat的bug,没有去验证,反正密码一样就不报错了。

命令执行成功后,默认会在用户的home目录下生成.keystore文件,可以使用-keystore 参数指定生成的地址
其他的是一些关于你的身份的信息

这样就生成了一个自签名的根证书

[root@localhost ~]# keytool -list -v
输入密钥库口令:  

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: rootca
创建日期: 2016-8-12
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN
发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN
序列号: 7228c046
有效期开始日期: Fri Aug 12 15:02:13 CST 2016, 截止日期: Thu Nov 10 15:02:13 CST 2016
证书指纹:
     MD5: 4D:C2:43:61:70:D8:B9:E8:C4:5E:04:0B:55:07:68:A3
     SHA1: DF:E1:FE:D0:1E:CC:B6:21:C0:CB:97:DE:89:D6:19:06:AA:3D:C2:58
     SHA256: 8E:9F:9C:1D:03:C6:CB:50:F6:6F:FD:99:B1:2C:BD:DA:F7:32:04:5A:0F:3A:7E:68:1D:75:1D:55:FF:6C:3B:63
     签名算法名称: SHA256withRSA
     版本: 3

扩展: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 93 FB 73 88 5C A1 5E 57   C5 9A 77 BB CC C7 A1 77  ..s.\.^W..w....w
0010: 8C C2 FA 8E                                        ....
]
]

*******************************************
*******************************************


[root@localhost ~]# 
可以看到这个证书的所有者和发布者都是xx认证中心,这就叫自签名.CA根证书都是自签名的

再生产一个自签名的证书,后面用前面这个rootca来签名这个证书,这样这个证书就不是自签名的证书,而是得到xx认证中心认证的证书了
[root@localhost ~]# keytool -genkeypair -alias baidu -keyalg RSA
输入密钥库口令:  
您的名字与姓氏是什么?
  [Unknown]:  www.baidu.com
您的组织单位名称是什么?
  [Unknown]:  百度技术有限公司
您的组织名称是什么?
  [Unknown]:  百度技术有限公司
您所在的城市或区域名称是什么?
  [Unknown]:  背景
您所在的省/市/自治区名称是什么?
  [Unknown]:  北京
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=www.baidu.com, OU=百度技术有限公司, O=百度技术有限公司, L=背景, ST=北京, C=CN是否正确?
  [否]:  Y

输入 <baidu> 的密钥口令
    (如果和密钥库口令相同, 按回车):  
[root@localhost ~]# 

现在假设我们是百度,我们需要申请一个证书,如上,我们生成了一个叫百度的自签名证书,但是百度的信用很差,广大网友不认可百度的信誉,所以百度的证书要到xx认证中心去认证。
先通过这个自签名证书生成一个证书请求

[root@localhost ~]# keytool -certreq -alias baidu -file baidu.csr
输入密钥库口令:  
[root@localhost ~]# ls 
anaconda-ks.cfg              gitdemo                mcr
apache-tomcat-7.0.69.tar.gz  install.log            MCR_R2014a_glnxa64_installer.zip
baidu.csr                    install.log.syslog     server-jre-7u79-linux-x64.tar.gz
datacenter.sql               leptonica-1.73         tesseract-master
git                          leptonica-1.73.tar.gz  tesseract-master.zip
[root@localhost ~]# 

这样就生成了一个证书请求文件baidu.csr。然后我们拿着这个文件和钱去xx认证中心
[root@localhost ~]# keytool -gencert -alias rootca -infile baidu.csr -outfile baidu.cer
输入密钥库口令:  
[root@localhost ~]# ls
anaconda-ks.cfg              gitdemo                MCR_R2014a_glnxa64_installer.zip
apache-tomcat-7.0.69.tar.gz  install.log            server-jre-7u79-linux-x64.tar.gz
baidu.cer                    install.log.syslog     tesseract-master
baidu.csr                    leptonica-1.73         tesseract-master.zip
datacenter.sql               leptonica-1.73.tar.gz
git                          mcr
[root@localhost ~]# 
baidu.cer就是经过认证中心认证的证书了。百度拿着这个证书就回家了,然后把这个证书导入密钥库。证书的发布者就变成了xx认证中心


[root@localhost ~]# keytool -importcert -alias baidu -file baidu.cer
输入密钥库口令:  
证书回复已安装在密钥库中
[root@localhost ~]# keytool -list -alias baidu -v
输入密钥库口令:  
别名: baidu
创建日期: 2016-8-12
条目类型: PrivateKeyEntry
证书链长度: 2
证书[1]:
所有者: CN=www.baidu.com, OU=百度技术有限公司, O=百度技术有限公司, L=背景, ST=北京, C=CN
发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN
序列号: 43c1823c
有效期开始日期: Fri Aug 12 15:40:29 CST 2016, 截止日期: Thu Nov 10 15:40:29 CST 2016
证书指纹:
     MD5: 49:AF:7E:D8:CA:6C:96:76:A8:8E:FC:2C:46:A2:A3:B4
     SHA1: 7F:73:80:E7:60:98:35:B0:BD:D8:B5:A2:E0:ED:0D:6B:48:49:31:F5
     SHA256: D8:CF:AF:41:8F:82:CA:C5:D2:6E:CB:23:FF:18:38:B6:92:29:AA:55:00:82:40:62:39:5D:C8:C7:7C:39:97:0F
     签名算法名称: SHA256withRSA
     版本: 3

扩展: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 93 FB 73 88 5C A1 5E 57   C5 9A 77 BB CC C7 A1 77  ..s.\.^W..w....w
0010: 8C C2 FA 8E                                        ....
]
]

#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F5 50 14 B1 93 94 B4 62   0F A1 DF D2 22 4E 1F A0  .P.....b...."N..
0010: 68 0F 8D 64                                        h..d
]
]

证书[2]:
所有者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN
发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN
序列号: 7228c046
有效期开始日期: Fri Aug 12 15:02:13 CST 2016, 截止日期: Thu Nov 10 15:02:13 CST 2016
证书指纹:
     MD5: 4D:C2:43:61:70:D8:B9:E8:C4:5E:04:0B:55:07:68:A3
     SHA1: DF:E1:FE:D0:1E:CC:B6:21:C0:CB:97:DE:89:D6:19:06:AA:3D:C2:58
     SHA256: 8E:9F:9C:1D:03:C6:CB:50:F6:6F:FD:99:B1:2C:BD:DA:F7:32:04:5A:0F:3A:7E:68:1D:75:1D:55:FF:6C:3B:63
     签名算法名称: SHA256withRSA
     版本: 3

扩展: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 93 FB 73 88 5C A1 5E 57   C5 9A 77 BB CC C7 A1 77  ..s.\.^W..w....w
0010: 8C C2 FA 8E                                        ....
]
]

[root@localhost ~]# 


可以看到,发布者已经变成xx认证中心了。
这里有几点要注意,导入的密钥库必须是之前生成证书请求的密钥库,并且alias也要和之前一样。因为证书只包含公钥,而私钥在密钥库,所以必须导入之前生成证书请求的密钥库,并且alias必须和之前相同,这样才知道这个证书属于哪个别名。之前不知道这个概念,把证书导入到新的密钥库,导致做https的时候出错


我们用浏览器访问https网站,有些会提示不安全,有些不会,为什么呢?那些不会提示的是因为他们用的是第三方权威机构认证的证书,而我们系统已经内置了很多权威机构的根证书。只要系统信任某个根证书,由此根证书签发的二级证书也会被系统信任。

刚才我们生成的CA根证书是不被系统信任的,所以我们要导出rootca的证书,并安装到系统中,这样由rootca签发的证书都会被信任。

[root@localhost ~]# keytool -exportcert -alias rootca -file rootca.cer
输入密钥库口令:  
存储在文件 <rootca.cer> 中的证书
[root@localhost ~]# 
把rootca.cer交给客户端,并导入系统,这样客户端浏览器访问我们的网站就不会提示不安全了。


--------------------- 
作者:fengwind1 
来源:CSDN 
原文:https://blog.csdn.net/fengwind1/article/details/52191520 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值