tomcat实现https双向认证配置

Tomcat实现https双向认证配置

  • 1.生成证书库
  • 2.jks转p12
  • 3.证书库导出cer文件
  • 4.证书库生成证书请求
  • 5.对证书请求进行签名
  • 6.例子
    • 6.1创建证书库
    • 6.2导出根证书
    • 6.3证书库发起请求
    • 6.4跟证书库对请求签名
    • 6.5根证书添加信任
    • 6.6签名文件添加信任
    • 6.7证书库导出cer
    • 6.8 cer生成临时证书库
    • 6.9从临时证书库导出p12
  • 7.证书安装
  • 8.客户端服务端增加相互信任
  • 9.tomcat设置

注意:本文偏重于实际操作,理论部分请自行掌握。
注意:所有的代码不可换行,在命令提示符中一行完成。
环境:window 7
注意:jdk版本–jdk1.8(1.7未测试,不过jdk6038这个版本一定不可以。因为使用根证书进行签名,这个版本的jdk没有对应的命令,可能是还不支持。不过,签名这一步可以在其他的环境中完成。生成证书的每一步分理论上都可以在独立的环境中完成。)

1.生成证书库

首先,根证书就是给别的证书签名的证书,根证书的职责就是与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位)
tomcat实现https双向认证配置_第1张图片
解释一下:
各位把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数据库表的密码

2.jks转p12

keytool -importkeystore -srckeystore H:\basic.keystore -destkeystore H:\basic.p12 -srcstorepass basic1 -deststorepass basicp

结果:
tomcat实现https双向认证配置_第2张图片
说明:
-importstore 使用导入证书库功能
-srckeystore源证书库
-destkeystore目标证书库(后缀表示格式-storetype具体查看文档,不过使用后缀更加简单,本来命令就很长了。)
-srcstorepass源证书库的密码
-deststorepass目标证书库的密码
主密码:证书库条目的密码(数据库表的密码)
此时在目标位置生成了一个basic.p12的证书库,p12可以在大多数的浏览器中导入。

3.证书库导出cer文件

首先使用查看命令查看证书库,看看有哪些条目(表)

keytool -v -list -keystore H:\basic.keystore -storepass basic1

结果:
tomcat实现https双向认证配置_第3张图片
说明:
-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以后有时间补充)

4.证书库生成证书请求

keytool -certreq -alias key_server -keystore H:\server.keystore -file H:\serverreq.cer -storepass server -keypass keyserver

此时会生成一个cer文件,安装提示无效的证书。
证书请求就是需要发送给ca或者第三方请求签名的文件。

5.对证书请求进行签名

keytool -gencert -v -alias basic -infile H:\serverreq.cer -outfile H:\resserver.cer -keystore H:\basic.keystore -storepass basic1 -keypass keybasic

此时会生成一个新的cer文件,这个文件就是签名后的文件。
说明:服务器发起请求,生成请求文件,第三方对请求文件进行签名,服务器把第三方的证书添加到可信列表,然后对签名后的文件添加可信链表,此时,就会形成一个信任链。
服务器信任第三方,签名后的文件来源于第三方,所以,信任签名后的文件。然后呢,我们的服务器也可以进行签名,这样,对于每一个证书,都可以追溯其源头,形成信任链。
这也是为什么ca是根证书认证中心。
以上命令执行无任何问题,但是,可能由于某些参数设置的问题,导致生成的证书不可用。所以,上面只是命令的解析,后面会有一个完整的例子。

6.例子

6.1创建证书库

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
//创建服务器证书库

6.2导出根证书

keytool -export -v -alias key_basic -keystore H:\basic.keystore -file H:\basic.cer -storepass basic1 -keypass keybasic
//导出根证书

6.3证书库发起请求

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
//客户端发起请求

6.4跟证书库对请求签名

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
//根证书签名客户端请求

6.5根证书添加信任

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
//客户端添加根证书

6.6签名文件添加信任

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
//客户端添加签名文件

6.7证书库导出cer

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

6.8 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创建临时证书库

6.9从临时证书库导出p12

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

7.证书安装

上述命令正确执行后生成的文件
tomcat实现https双向认证配置_第4张图片
安装根证书
basic.cer
tomcat实现https双向认证配置_第5张图片
tomcat实现https双向认证配置_第6张图片
tomcat实现https双向认证配置_第7张图片
tomcat实现https双向认证配置_第8张图片
安装client.cer
tomcat实现https双向认证配置_第9张图片
但是如果卸载掉之前装的basic.cer
使用win+R运行certmgr.msc
tomcat实现https双向认证配置_第10张图片
第二个basic就是之前安装的,第一个是我自己测试的时候安装的。右键删除basic证书。
此时安装client.cer
tomcat实现https双向认证配置_第11张图片
很明显,有警告提示了。如果你能把自己basic.cer直接在操作系统层面,从计算机出厂就默认安装,那么,你就有和ca同样的权利,使用basic进行签名的证书,都不会有警告。这也是正规证书和野证书的区别。正规证书是我们一开始安装client.cer的情况,野证书会有提示。
这也是我们为什么要大费周折的创建一个basic证书库,因为把basic证书库自己添加到可信任机构,那么由basic签名的证书都不会提示。
接下来安装p12文件(未安装basic)
tomcat实现https双向认证配置_第12张图片
提示输入密码,这个密码是哪里设置的?

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
//查看

tomcat实现https双向认证配置_第13张图片
tomcat实现https双向认证配置_第14张图片
tomcat实现https双向认证配置_第15张图片
总结一下:
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

8.客户端服务端增加相互信任

服务器证书库添加信任客户端证书(增加一张表)

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

9.tomcat设置

Tomcat安装目录下的conf文件夹中的server.xml文件中加入


注意反斜杠
然后启动
注意:这里有一个坑----
先不要用bin目录下的startup,先使用configtest,测试一下,会发现报错:
tomcat实现https双向认证配置_第16张图片
原因:我们数据库有一个密码,数据库表还有一个密码。
对应:我们证书库有一个密码,而每一个条目还有对应的密码。
但是tomcat配置中只有一个密码参数,所以要求证书库的密码和条目的密码需要一致。

修改对应条目的密码

keytool -keypasswd -v -alias key_server -keystore H:\server.keystore -storepass server -keypass keyserver -new server
//修改条目密码

第二个坑:使用keytool -help 没有-keypasswd这个参数。导致刚开始只要发现需要改条目密码就需要重新创建。=。。=很坑。
再次运行测试:
tomcat实现https双向认证配置_第17张图片
然后使用startup启动
tomcat实现https双向认证配置_第18张图片
使用浏览器访问:
tomcat实现https双向认证配置_第19张图片
浏览器导入p12文件:客户端的
tomcat实现https双向认证配置_第20张图片

安装basic.cer
tomcat实现https双向认证配置_第21张图片

你可能感兴趣的:(网站,java)