https://blog.csdn.net/fengwind1/article/details/52191520
keytool是jdk自带的一款ssl管理工具,jdk6和jdk7的keytool命令有些不同,jdk7的兼容jdk6的,这里用的是jdk7下的keytool。搞了两天,遇到各种问题,甚是艰难啊
-
[root@localhost ~]# keytool -help
-
密钥和证书管理工具
-
命令:
-
-certreq 生成证书请求
-
-changealias 更改条目的别名
-
-delete 删除条目
-
-exportcert 导出证书
-
-genkeypair 生成密钥对
扫描二维码关注公众号,回复: 3567475 查看本文章 -
-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?utm_source=copy