首先,根证书就是给别的证书签名的证书,根证书的职责就是与CA做同样的事情,确认其他的证书是否可信,如果可信,进行签名。
keytool -genkey -alias basic -keyalg dsa -keysize 1024 -sigalg dsa -startdate 2018/11/01 -validity 365 -keystore H:\basic.keystore -storepass basic1 -keypass keybasic
结果(密码最少6位)
解释一下:
各位把keystore当做数据库,basic当做表就比较容易理解了。上面的命令使用类比数据库的方式来解释:
keytool表示使用java_home中的bin中的keytool.exe这个程序
-genkey表示新建一个密钥对–新建一个数据库
-alias表示数据库中新建一个表
basic是数据库中的一张表的名字
-keyalg数据库中数据加密的方式
dsa一种加密方法
-keysize加密长度
1024字节
-sigalg签名的加密方式
dsa加密方式
-startdate数据库开始(创建)时间(ps:时间格式yyyy/mm/dd,还可以加上具体的时间不过在oracle官网中没有给出具体的例子keytool官网文档传送门)
-validity有效时间
365(天)
-keystore创建数据库(证书库)
H:\basic.keystore(路径和文件名字,其实文件的后缀隐士的给出了证书库的格式jks,其他的请在官网查找)
-storepass数据库的密码
-keypass数据库表的密码
keytool -importkeystore -srckeystore H:\basic.keystore -destkeystore H:\basic.p12 -srcstorepass basic1 -deststorepass basicp
结果:
说明:
-importstore 使用导入证书库功能
-srckeystore源证书库
-destkeystore目标证书库(后缀表示格式-storetype具体查看文档,不过使用后缀更加简单,本来命令就很长了。)
-srcstorepass源证书库的密码
-deststorepass目标证书库的密码
主密码:证书库条目的密码(数据库表的密码)
此时在目标位置生成了一个basic.p12的证书库,p12可以在大多数的浏览器中导入。
首先使用查看命令查看证书库,看看有哪些条目(表)
keytool -v -list -keystore H:\basic.keystore -storepass basic1
结果:
说明:
-v详细输出
-list查看
接下来获得cer文件
keytool -export -v -alias basic -keystore H:\basic.keystore -file H:\basic.cer -storepass basic1 -keypass keypass
此时生成了basic.cer文件,cer文件是给window用来安装证书的(ps:linux以后有时间补充)
keytool -certreq -alias key_server -keystore H:\server.keystore -file H:\serverreq.cer -storepass server -keypass keyserver
此时会生成一个cer文件,安装提示无效的证书。
证书请求就是需要发送给ca或者第三方请求签名的文件。
keytool -gencert -v -alias basic -infile H:\serverreq.cer -outfile H:\resserver.cer -keystore H:\basic.keystore -storepass basic1 -keypass keybasic
此时会生成一个新的cer文件,这个文件就是签名后的文件。
说明:服务器发起请求,生成请求文件,第三方对请求文件进行签名,服务器把第三方的证书添加到可信列表,然后对签名后的文件添加可信链表,此时,就会形成一个信任链。
服务器信任第三方,签名后的文件来源于第三方,所以,信任签名后的文件。然后呢,我们的服务器也可以进行签名,这样,对于每一个证书,都可以追溯其源头,形成信任链。
这也是为什么ca是根证书认证中心。
以上命令执行无任何问题,但是,可能由于某些参数设置的问题,导致生成的证书不可用。所以,上面只是命令的解析,后面会有一个完整的例子。
keytool -genkey -alias key_basic -validity 365 -keystore H:\basic.keystore -storepass basic1 -keypass keybasic
//创建根证书库
keytool -genkey -alias key_client -validity 365 -keystore H:\client.keystore -storepass client -keypass keyclient
//创建客户端证书库
keytool -genkey -alias key_server -validity 365 -keystore H:\server.keystore -storepass server -keypass keyserver
//创建服务器证书库
keytool -export -v -alias key_basic -keystore H:\basic.keystore -file H:\basic.cer -storepass basic1 -keypass keybasic
//导出根证书
keytool -certreq -alias key_server -keystore H:\server.keystore -file H:\server_req.cer -storepass server -keypass keyserver
//服务器发起请求
keytool -certreq -alias key_client -keystore H:\client.keystore -file H:\client_req.cer -storepass client -keypass keyclient
//客户端发起请求
keytool -gencert -v -alias key_basic -infile H:\server_req.cer -outfile H:\res_server.cer -keystore H:\basic.keystore -storepass basic1 -keypass keybasic
//根证书签名服务器请求
keytool -gencert -v -alias key_basic -infile H:\client_req.cer -outfile H:\res_client.cer -keystore H:\basic.keystore -storepass basic1 -keypass keybasic
//根证书签名客户端请求
keytool -importcert -v -alias key_basic -file H:\basic.cer -keystore H:\server.keystore -storepass server -keypass keybasic
//服务器添加根证书
keytool -importcert -v -alias key_basic -file H:\basic.cer -keystore H:\client.keystore -storepass client -keypass keybasic
//客户端添加根证书
keytool -importcert -v -alias key_server -file H:\res_server.cer -keystore H:\server.keystore -storepass server -keypass keyserver
//服务器添加签名文件
keytool -importcert -v -alias key_client -file H:\res_client.cer -keystore H:\client.keystore -storepass client -keypass keyclient
//客户端添加签名文件
keytool -export -v -alias key_server -keystore H:\server.keystore -file H:\server.cer -storepass server -keypass keyserver
//服务器导出cer
keytool -export -v -alias key_client -keystore H:\client.keystore -file H:\client.cer -storepass client -keypass keyclient
//客户端导出cer
keytool -importcert -v -alias server_temp -keystore H:\server_temp.keystore -file H:\server.cer -storepass servertemp -keypass server_temp
//服务器cer创建临时证书库
keytool -importcert -v -alias client_temp -keystore H:\client_temp.keystore -file H:\client.cer -storepass clienttemp -keypass client_temp
//客户端cer创建临时证书库
keytool -importkeystore -v -srcalias server_temp -destalias server -srckeystore H:\server_temp.keystore -destkeystore H:\server.p12 -srcstoretype jks -deststoretype pkcs12 -srcstorepass servertemp -deststorepass server -srckeypass server_temp
//服务器临时证书库导出p12
keytool -importkeystore -v -srcalias client_temp -destalias client -srckeystore H:\client_temp.keystore -destkeystore H:\client.p12 -srcstoretype jks -deststoretype pkcs12 -srcstorepass clienttemp -deststorepass client -srckeypass client_temp
//客户端临时证书库导出p12
上述命令正确执行后生成的文件
安装根证书
basic.cer
安装client.cer
但是如果卸载掉之前装的basic.cer
使用win+R运行certmgr.msc
第二个basic就是之前安装的,第一个是我自己测试的时候安装的。右键删除basic证书。
此时安装client.cer
很明显,有警告提示了。如果你能把自己basic.cer直接在操作系统层面,从计算机出厂就默认安装,那么,你就有和ca同样的权利,使用basic进行签名的证书,都不会有警告。这也是正规证书和野证书的区别。正规证书是我们一开始安装client.cer的情况,野证书会有提示。
这也是我们为什么要大费周折的创建一个basic证书库,因为把basic证书库自己添加到可信任机构,那么由basic签名的证书都不会提示。
接下来安装p12文件(未安装basic)
提示输入密码,这个密码是哪里设置的?
keytool -importkeystore -v -srcalias client_temp -destalias client -srckeystore H:\client_temp.keystore -destkeystore H:\client.p12 -srcstoretype jks -deststoretype pkcs12 -srcstorepass clienttemp -deststorepass client -srckeypass client_temp
//客户端临时证书库导出p12
这里的deststorepass的值就是上面图片需要的密码。
现在查看一下服务器证书库,客户端证书库,跟证书库的情况:
根证书库:
keytool -v -list -keystore H:\basic.keystore -storepass basic1
//查看
总结一下:
basic:----------key_basic------所有者basic------发布者basic-----链长度1
server:----key_basic-------所有者basic------发布者basic
-------key_server---------链长度2-------所有者server-----发布者basic
链接到key_basic
client:----key_client------所有者basic------发布者basic
------key_client-----链长度2-----所有者client-----发布者basic
服务器证书库添加信任客户端证书(增加一张表)
keytool -importcert -alias key_client -keystore H:\server.keystore -file H:\client.cer -storepass server -keypass keyclient
客户端证书库添加信任服务端证书
keytool -importcert -alias key_server -keystore H:\client.keystore -file H:\server.cer -storepass client -keypass keyserver
Tomcat安装目录下的conf文件夹中的server.xml文件中加入
注意反斜杠
然后启动
注意:这里有一个坑----
先不要用bin目录下的startup,先使用configtest,测试一下,会发现报错:
原因:我们数据库有一个密码,数据库表还有一个密码。
对应:我们证书库有一个密码,而每一个条目还有对应的密码。
但是tomcat配置中只有一个密码参数,所以要求证书库的密码和条目的密码需要一致。
修改对应条目的密码
keytool -keypasswd -v -alias key_server -keystore H:\server.keystore -storepass server -keypass keyserver -new server
//修改条目密码
第二个坑:使用keytool -help 没有-keypasswd这个参数。导致刚开始只要发现需要改条目密码就需要重新创建。=。。=很坑。
再次运行测试:
然后使用startup启动
使用浏览器访问:
浏览器导入p12文件:客户端的