基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)

先推荐一个大神的文章,讲的特别好,就算像我这种零基础的也能看懂。

一、记录一下对HTTP、HTTPS的理解:

  1. HTTP:通过TCP/IP协议三次握手即可建立HTTP连接。TCP/IP三次握手流程为:

    1. A机向B机发送一个包含同步序列号SYN=0的数据段。表示请求连接。
    2. B机收到之后,发送一个同步序列号SYN=0且确认应答ACK= (请求连接SYN +1) 的数据段。表示同意连接。
    3. A机收到B机器的数据段后,向B机发送同步序列号SYN为1,且确认应答ACK=1的数据段。

    三次握手完成,HTTP连接建立。

    关闭时,TCP/IP需要4次握手关闭连接。这主要是因为单向关闭造成的。TCP/IP四次握手关闭连接流程为:

    1. 需要关闭数据传输的一方发送FIN标志位为1的数据段,表示提示关闭。
    2. 另一方收到数据包后,发送确认标志位ACK为1,表示同意关闭。到此为止,单向关闭完成。
    3. 剩余一方发送FIN标志位为1的数据段,表示请求关闭。
    4. 另一方收到后返回确认标志位ACK为 1的数据字段表示同意关闭。另一个单向关闭完成。
    5. 四次握手完成,HTTP连接关闭。
  2. HTTPS:HTTPS是在http协议的基础上加上了SSL/TSL安全协议,HTTPS是HTTP的安全版。步骤大致理解如下:

    1.ClientHello阶段:客户端输入网址后,会以明文的方式向目标IP的443端口(HTTPS默认443端口)发送数据段,包括TLS协议版本信息、session id、以及所支持的加密算法等内容。

    2.ServerHello阶段:服务器收到后,选择加密算法、TLS协议版本等,并且向客户端发送自己的证书。

    3.客户端认证阶段:客户端收到服务器的证书后,首先会去对证书进行验证。如果证书没有问题,则说明证书确实是服务器的。然后客户端生成一个随机数ClientRandom,并使用服务器证书中的公钥进行加密,并且发送给服务器。服务器收到加密的内容后,使用自己的私钥进行解密,并将结果返回客户端,客户端将加密前和解密后的结果进行比对,如果一样,则证明对方是服务器。

    4.生成新的加密算法阶段:客户端确认对方是服务器后,客户端生成一个对称加密算法,并通过服务器的公钥进行加密。由于私钥只有服务器持有,所以只有服务器可以解码新的对称加密算法。

    5.通信阶段:之后客户端和服务器之间就通过新的对称加密算法来进行数据传输。

    上面大致描述了HTTPS的交互过程。

二、记录配置tomcat双向https认证过程

  1. 环境要求
    由于对Springboot项目使用了war包方式部署在外置tomcat上,因此tomcat服务器必须要有。(如何使用war包即外置tomcat部署Springboot项目点这里)。其次keytool自签证书生成工具是JDK自带的工具,所以想使用keytool也必须安装好java环境,并且配置环境变量。

  2. 生成服务器证书库:
    要想客户端认可服务器,那么服务器就必须有自己的证书。
    在cmd命令行中输入:

    keytool -genkey -v -alias  tomcat -keyalg RSA -keystore D:\server.keystore -validity 365
	 keytool:工具名
	 -genkey:generate key  生成密钥
	 -alias:证书名
	 -keyalg:密钥加密方式
	 -keystore:生成的证书库存储位置。其中D:\server.keystore中的后缀表示server是存放证书的地方,可以理解为证书库。
	 -validity:有效日期,这里是365天

其实可以用数据库的思想来理解这句话:在server库中生成一个加密方式为RSA,有效期为365天的tomcat表。

点击回车,会要求你设置你要创建的这个库的密码,这个服务器证书库密码比较重要,后面配置tomcat时,需要用到。

其次是"您的名字与姓氏"这里需要输入你的服务器域名或者IP。如果是本地测试的话,基本上输入 localhost或者你自己的IP就行。

其余的内容随便填,不填也可以。
基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第1张图片
确认之后会在你设置的目录下生成server.keystore证书库。

基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第2张图片
3. 生成客户端证书

可以把你的电脑想象成一个客户端整体,生成的客户端证书你可以直接安装在电脑上,浏览器会自动去对应地方获取;也可以直接导入浏览器中。反正都是安装在了客户机上。由于某些浏览器对证书有一定的格式要求,因此要指定生成的证书格式为PKCS12。

在CMD命令行中输入:

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\client.p12

这里的参数在创建服务器证书库的时候已经介绍了,这里不说了。

可以把这句话理解为 在client.p12库中创建一个格式为PKCS12,加密方式为PSA的表mykey。

点击回车同样会让你设置证书库的密码和设置一些信息。不过这里除了密码外,其余的所有信息你都可以随便写,甚至不填。同样会在你设置的目录下生成也给client.p12库文件。

4.服务器信任客户端证书

为了让服务器相信客户端是真的客户端,而不是黑客,我们需要把上述创建的客户端证书交给服务器。但是我们创建的客户端证书格式为PKCS12格式,这个格式是为了导入浏览器的,而不是交给服务器的,所以我们需要将其导出为服务器证书库接受的cer格式。

4.1 从客户端证书库中导出证书,并转换格式为cer

在CMD命令行输入:

keytool -export -alias mykey -keystore D:\client.p12 -storetype PKCS12 -storepass XXXXX -rfc -file D:\mykey.cer

可以理解为:从密码为XXXX的D:\client.p12库中导出存储格式为PKCS12的表mykey,并转换格式存储为mykey.cer。

4.2 将导出的cer客户端证书导入服务器证书库中

在CMD命令行输入:

keytool -import -v -file D:\mykey.cer -keystore D:\server.keystore

点击回车之后会对你验证身份,需要输入服务器证书库的密码,并询问是否信任此证书。当然是信任了。

这样,你的服务器证书库中就有两个证书了:服务器证书、客户端证书。

4.3 确认一下是否导入成功

在CMD命令行输入:

keytool -list -keystore D:\server.keystore

输入服务器证书库密码,查看内容。如果有两个证书,那表示将客户端证书导入服务器证书库成功!
基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第3张图片
5.客户端相信服务器证书

5.1 导出服务器证书

步骤4中将客户端证书库中的客户端证书导出,再导入服务器证书库中。这里为了把服务器证书交给客户端,也是先把服务器证书从服务器证书库中将其导出,然后再安装在客户端的电脑上。

在CMD命令行中输入:

keytool -keystore D:\server.keystore -export -alias tomcat -file D:\tomcat.cer

这行命令可以理解为 使用keytool工具,从server数据库中导出tomcat表,导出格式和命名为tomcat.cer。

5.2 安装服务器和客户端证书

直接双击运行刚才导出的tomcat.cer文件,将其安装在 受信任的根证书颁发机构中即可。
基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第4张图片
上述操作完成后,电脑上已经有了服务器的证书,下面就是把客户端的证书也安装在电脑上。方便与服务器进行交互。
点击生成的client.p12,输入之前设置的客户端密码,导入即可。

安装完成后,可以通过win+R 输入certmgr.msc或者直接在浏览器中找到证书选项,就可以看到证书是否成功安装在电脑上。

这里通过浏览器来查看。
基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第5张图片
基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第6张图片
图1 是客户端的证书安装在浏览器中,方便向服务器提交。图2 是服务器的证书,方便客户端检查。

6. 配置Tomcat

到目前为止,我们创建了客户端证书、服务器证书。并且将客户端证书、服务器证书都安装在了客户端电脑上(这样一来,客户端就知道两个证书在哪里了)。但我们的服务器tomcat并不知道服务端的证书在哪里,所以要去配置一下tomcat conf目录下的server.xml。

打开server.xml配置文件,找到如下代码块:

  

将其改为:

 
	port表示端口,由于https协议默认端口是443,所以这里改成443,这样输入网址的时候可以不输入端口号。
	protocol表示协议。
	clientAuth表示是否启用双向验证。默认为false。
	keystoreFile 表示服务器证书库的位置。
	truststoreFile 表示验证客户端证书的根证书。

7. 测试

之前我使用的是新版IE浏览器。也可以成功访问,但是一直提示网站不安全,后来我查了一天的资料都无果。

后来看到一个说法说是自签证书安全性低,现在好多浏览器都不完全认可了。

后来觉得有可能,就用老版本IE试了试。果然不提示不安全了。

基于windows下的Tomcat8配置双向https认证(使用keytool自签证书)_第7张图片
使用旧版IE成功使用https访问,说明配置成功。

其实不管用新版浏览器还是旧版浏览器,只要能成功访问,就算提示不安全也说明tomcat双向配置https成功了。

你可能感兴趣的:(https,http,tomcat,ssl)