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

https://blog.csdn.net/fengwind1/article/details/52191520

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

 
  1. [root@localhost ~]# keytool -help

  2. 密钥和证书管理工具

  3.  
  4. 命令:

  5.  
  6. -certreq 生成证书请求

  7. -changealias 更改条目的别名

  8. -delete 删除条目

  9. -exportcert 导出证书

  10. -genkeypair 生成密钥对

  11. -genseckey 生成密钥

  12. -gencert 根据证书请求生成证书

  13. -importcert 导入证书或证书链

  14. -importkeystore 从其他密钥库导入一个或所有条目

  15. -keypasswd 更改条目的密钥口令

  16. -list 列出密钥库中的条目

  17. -printcert 打印证书内容

  18. -printcertreq 打印证书请求的内容

  19. -printcrl 打印 CRL 文件的内容

  20. -storepasswd 更改密钥库的存储口令

  21.  
  22. 使用 "keytool -command_name -help" 获取 command_name 的用法


这是支持的命令,可以使用 keytool -command_name -help获得子命令的用法,如 keytool -genkeypair -help.

生成自签名的证书

 
  1. [root@localhost ~]# keytool -genkeypair -alias rootca -keyalg RSA

  2. 输入密钥库口令:

  3. 再次输入新口令:

  4. 您的名字与姓氏是什么?

  5. [Unknown]: xx认证中心

  6. 您的组织单位名称是什么?

  7. [Unknown]: xx认证中心

  8. 您的组织名称是什么?

  9. [Unknown]: xxrenz^H^H^H^[[D

  10. 您所在的城市或区域名称是什么?

  11. [Unknown]: zz

  12. 您所在的省/市/自治区名称是什么?

  13. [Unknown]: gd

  14. 该单位的双字母国家/地区代码是什么?

  15. [Unknown]: CN

  16. CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN是否正确?

  17. [否]: Y

  18.  
  19. 输入 <rootca> 的密钥口令

  20. (如果和密钥库口令相同, 按回车):

  21. [root@localhost ~]#

 alias是别名,就是给某某证书取个名字,可以随便写,可以用changealias命令修改

keyalg是加密算法,有DSA,RSA,默认是DSA,因为DSA只能用于加密,不能用户证书签名,所以这里必须指定使用RSA算法

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

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

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

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

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

 
  1. [root@localhost ~]# keytool -list -v

  2. 输入密钥库口令:

  3.  
  4. 密钥库类型: JKS

  5. 密钥库提供方: SUN

  6.  
  7. 您的密钥库包含 1 个条目

  8.  
  9. 别名: rootca

  10. 创建日期: 2016-8-12

  11. 条目类型: PrivateKeyEntry

  12. 证书链长度: 1

  13. 证书[1]:

  14. 所有者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN

  15. 发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN

  16. 序列号: 7228c046

  17. 有效期开始日期: Fri Aug 12 15:02:13 CST 2016, 截止日期: Thu Nov 10 15:02:13 CST 2016

  18. 证书指纹:

  19. MD5: 4D:C2:43:61:70:D8:B9:E8:C4:5E:04:0B:55:07:68:A3

  20. SHA1: DF:E1:FE:D0:1E:CC:B6:21:C0:CB:97:DE:89:D6:19:06:AA:3D:C2:58

  21. 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

  22. 签名算法名称: SHA256withRSA

  23. 版本: 3

  24.  
  25. 扩展:

  26.  
  27. #1: ObjectId: 2.5.29.14 Criticality=false

  28. SubjectKeyIdentifier [

  29. KeyIdentifier [

  30. 0000: 93 FB 73 88 5C A1 5E 57 C5 9A 77 BB CC C7 A1 77 ..s.\.^W..w....w

  31. 0010: 8C C2 FA 8E ....

  32. ]

  33. ]

  34.  
  35.  
  36.  
  37. *******************************************

  38. *******************************************

  39.  
  40.  
  41. [root@localhost ~]#

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

再生产一个自签名的证书,后面用前面这个rootca来签名这个证书,这样这个证书就不是自签名的证书,而是得到xx认证中心认证的证书了

 
  1. [root@localhost ~]# keytool -genkeypair -alias baidu -keyalg RSA

  2. 输入密钥库口令:

  3. 您的名字与姓氏是什么?

  4. [Unknown]: www.baidu.com

  5. 您的组织单位名称是什么?

  6. [Unknown]: 百度技术有限公司

  7. 您的组织名称是什么?

  8. [Unknown]: 百度技术有限公司

  9. 您所在的城市或区域名称是什么?

  10. [Unknown]: 背景

  11. 您所在的省/市/自治区名称是什么?

  12. [Unknown]: 北京

  13. 该单位的双字母国家/地区代码是什么?

  14. [Unknown]: CN

  15. CN=www.baidu.com, OU=百度技术有限公司, O=百度技术有限公司, L=背景, ST=北京, C=CN是否正确?

  16. [否]: Y

  17.  
  18. 输入 <baidu> 的密钥口令

  19. (如果和密钥库口令相同, 按回车):

  20. [root@localhost ~]#


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

先通过这个自签名证书生成一个证书请求

 
  1. [root@localhost ~]# keytool -certreq -alias baidu -file baidu.csr

  2. 输入密钥库口令:

  3. [root@localhost ~]# ls

  4. anaconda-ks.cfg gitdemo mcr

  5. apache-tomcat-7.0.69.tar.gz install.log MCR_R2014a_glnxa64_installer.zip

  6. baidu.csr install.log.syslog server-jre-7u79-linux-x64.tar.gz

  7. datacenter.sql leptonica-1.73 tesseract-master

  8. git leptonica-1.73.tar.gz tesseract-master.zip

  9. [root@localhost ~]#


这样就生成了一个证书请求文件baidu.csr。然后我们拿着这个文件和钱去xx认证中心

 
  1. [root@localhost ~]# keytool -gencert -alias rootca -infile baidu.csr -outfile baidu.cer

  2. 输入密钥库口令:

  3. [root@localhost ~]# ls

  4. anaconda-ks.cfg gitdemo MCR_R2014a_glnxa64_installer.zip

  5. apache-tomcat-7.0.69.tar.gz install.log server-jre-7u79-linux-x64.tar.gz

  6. baidu.cer install.log.syslog tesseract-master

  7. baidu.csr leptonica-1.73 tesseract-master.zip

  8. datacenter.sql leptonica-1.73.tar.gz

  9. git mcr

  10. [root@localhost ~]#

baidu.cer就是经过认证中心认证的证书了。百度拿着这个证书就回家了,然后把这个证书导入密钥库。证书的发布者就变成了xx认证中心

 
  1. [root@localhost ~]# keytool -importcert -alias baidu -file baidu.cer

  2. 输入密钥库口令:

  3. 证书回复已安装在密钥库中

  4. [root@localhost ~]# keytool -list -alias baidu -v

  5. 输入密钥库口令:

  6. 别名: baidu

  7. 创建日期: 2016-8-12

  8. 条目类型: PrivateKeyEntry

  9. 证书链长度: 2

  10. 证书[1]:

  11. 所有者: CN=www.baidu.com, OU=百度技术有限公司, O=百度技术有限公司, L=背景, ST=北京, C=CN

  12. 发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN

  13. 序列号: 43c1823c

  14. 有效期开始日期: Fri Aug 12 15:40:29 CST 2016, 截止日期: Thu Nov 10 15:40:29 CST 2016

  15. 证书指纹:

  16. MD5: 49:AF:7E:D8:CA:6C:96:76:A8:8E:FC:2C:46:A2:A3:B4

  17. SHA1: 7F:73:80:E7:60:98:35:B0:BD:D8:B5:A2:E0:ED:0D:6B:48:49:31:F5

  18. 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

  19. 签名算法名称: SHA256withRSA

  20. 版本: 3

  21.  
  22. 扩展:

  23.  
  24. #1: ObjectId: 2.5.29.35 Criticality=false

  25. AuthorityKeyIdentifier [

  26. KeyIdentifier [

  27. 0000: 93 FB 73 88 5C A1 5E 57 C5 9A 77 BB CC C7 A1 77 ..s.\.^W..w....w

  28. 0010: 8C C2 FA 8E ....

  29. ]

  30. ]

  31.  
  32. #2: ObjectId: 2.5.29.14 Criticality=false

  33. SubjectKeyIdentifier [

  34. KeyIdentifier [

  35. 0000: F5 50 14 B1 93 94 B4 62 0F A1 DF D2 22 4E 1F A0 .P.....b...."N..

  36. 0010: 68 0F 8D 64 h..d

  37. ]

  38. ]

  39.  
  40. 证书[2]:

  41. 所有者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN

  42. 发布者: CN=xx认证中心, OU=xx认证中心, O=xx, L=zz, ST=gd, C=CN

  43. 序列号: 7228c046

  44. 有效期开始日期: Fri Aug 12 15:02:13 CST 2016, 截止日期: Thu Nov 10 15:02:13 CST 2016

  45. 证书指纹:

  46. MD5: 4D:C2:43:61:70:D8:B9:E8:C4:5E:04:0B:55:07:68:A3

  47. SHA1: DF:E1:FE:D0:1E:CC:B6:21:C0:CB:97:DE:89:D6:19:06:AA:3D:C2:58

  48. 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

  49. 签名算法名称: SHA256withRSA

  50. 版本: 3

  51.  
  52. 扩展:

  53.  
  54. #1: ObjectId: 2.5.29.14 Criticality=false

  55. SubjectKeyIdentifier [

  56. KeyIdentifier [

  57. 0000: 93 FB 73 88 5C A1 5E 57 C5 9A 77 BB CC C7 A1 77 ..s.\.^W..w....w

  58. 0010: 8C C2 FA 8E ....

  59. ]

  60. ]

  61.  
  62. [root@localhost ~]#

  63.  

可以看到,发布者已经变成xx认证中心了。

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

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

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

 
  1. [root@localhost ~]# keytool -exportcert -alias rootca -file rootca.cer

  2. 输入密钥库口令:

  3. 存储在文件 <rootca.cer> 中的证书

  4. [root@localhost ~]#

把rootca.cer交给客户端,并导入系统,这样客户端浏览器访问我们的网站就不会提示不安全了。

--------------------- 本文来自 fengwind1 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/fengwind1/article/details/52191520?utm_source=copy

猜你喜欢

转载自blog.csdn.net/stone2043/article/details/82981586
今日推荐