先推荐一个大神的文章,讲的特别好,就算像我这种零基础的也能看懂。
一、记录一下对HTTP、HTTPS的理解:
HTTP:通过TCP/IP协议三次握手即可建立HTTP连接。TCP/IP三次握手流程为:
三次握手完成,HTTP连接建立。
关闭时,TCP/IP需要4次握手关闭连接。这主要是因为单向关闭造成的。TCP/IP四次握手关闭连接流程为:
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认证过程
环境要求:
由于对Springboot项目使用了war包方式部署在外置tomcat上,因此tomcat服务器必须要有。(如何使用war包即外置tomcat部署Springboot项目点这里)。其次keytool自签证书生成工具是JDK自带的工具,所以想使用keytool也必须安装好java环境,并且配置环境变量。
生成服务器证书库:
要想客户端认可服务器,那么服务器就必须有自己的证书。
在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就行。
其余的内容随便填,不填也可以。
确认之后会在你设置的目录下生成server.keystore证书库。
可以把你的电脑想象成一个客户端整体,生成的客户端证书你可以直接安装在电脑上,浏览器会自动去对应地方获取;也可以直接导入浏览器中。反正都是安装在了客户机上。由于某些浏览器对证书有一定的格式要求,因此要指定生成的证书格式为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
输入服务器证书库密码,查看内容。如果有两个证书,那表示将客户端证书导入服务器证书库成功!
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文件,将其安装在 受信任的根证书颁发机构中即可。
上述操作完成后,电脑上已经有了服务器的证书,下面就是把客户端的证书也安装在电脑上。方便与服务器进行交互。
点击生成的client.p12,输入之前设置的客户端密码,导入即可。
安装完成后,可以通过win+R 输入certmgr.msc或者直接在浏览器中找到证书选项,就可以看到证书是否成功安装在电脑上。
这里通过浏览器来查看。
图1 是客户端的证书安装在浏览器中,方便向服务器提交。图2 是服务器的证书,方便客户端检查。
6. 配置Tomcat
到目前为止,我们创建了客户端证书、服务器证书。并且将客户端证书、服务器证书都安装在了客户端电脑上(这样一来,客户端就知道两个证书在哪里了)。但我们的服务器tomcat并不知道服务端的证书在哪里,所以要去配置一下tomcat conf目录下的server.xml。
打开server.xml配置文件,找到如下代码块:
将其改为:
port表示端口,由于https协议默认端口是443,所以这里改成443,这样输入网址的时候可以不输入端口号。
protocol表示协议。
clientAuth表示是否启用双向验证。默认为false。
keystoreFile 表示服务器证书库的位置。
truststoreFile 表示验证客户端证书的根证书。
7. 测试
之前我使用的是新版IE浏览器。也可以成功访问,但是一直提示网站不安全,后来我查了一天的资料都无果。
后来看到一个说法说是自签证书安全性低,现在好多浏览器都不完全认可了。
后来觉得有可能,就用老版本IE试了试。果然不提示不安全了。
其实不管用新版浏览器还是旧版浏览器,只要能成功访问,就算提示不安全也说明tomcat双向配置https成功了。