Https全揭秘系列 - 实践与分析
通过前面两篇文章,我们对于Https协议和TLS握手协议有了一定的理解,但是我认为不经过真正实践的话根本无法掌握这个协议,大家看完了过几天就应该忘的一干二净了。
这篇文章的标题是实践与分析,实践刚才讲了是为了真正掌握,那么为什么要加个分析呢?因为真正商用场景下关于Https故障的排查关键就在于如何去分析,至于分析有两种方法,下一篇文章我将针对实际工作中遇到的问题结合这两种方法进行分析。
话不多说,开始今天的文章
1.构建一个完整流程
这一章我将构造一个最简单的服务端与客户端,麻雀虽小五脏俱全,对于TLS握手过程的理解还是够用的。
1.1 服务端
服务端我使用Jetty作为容器,搭载一个简单的Servlet。由于代码非常简单,直接贴上完整代码。
我将上一篇文章中创建的server.keystore、server.truststore、client.keystore、client.truststore这四个文件放到了项目的src/main/resources/certs目录下。
在initParams方法中我初始化了构建服务端和Https的参数,这里面needClientAuth需要注意一下,Jetty使用这个参数来指定单向认证还是双向认证,注释中我也写了true情况下是TWOWAYCERTIFICATE也就是双向认证。
Jetty和Tomcat类似,都可以使用配置文件或者代码来初始化参数,这里我按照习惯使用代码初始化。
通过这些代码,我们就创建了一个部署在127.0.0.1:8083上的Jetty服务端,至于JettyServlet这个Servlet就是一个空的Servlet不做任何工作,服务端使用TLSv1.2协议。
1.2 客户端
客户端使用Apache的HttpClient
注意getSSLContext方法,这里同服务端一样,也是区分了单双向认证。
完整的项目源码可以使用Git直接拷贝下来
2.调试与抓包
IDEA和Eclipse可分别参照下面图片进行配置。
现在,我们启动服务端,在控制台中我们将看到以下几段信息
这一段信息显示了我们服务端加载的Keystore中的信息,还记得我们前一篇文章中创建的服务端Keystore中只有一个别名为server的私钥么,现在正确加载进来了,证书签名、加密算法都显示在上面。
接下来这段相信大家也能看明白,这是读取到的Truststore中的内容,也就是我们上篇文章中导入的客户端的证书信息。
这一串信息是我们服务端不使用的加密套件,这个与TLS版本有关。至于这么多加密套件有什么意义我们后面再讲。
接下来我们启动客户端,这里我直接贴出除了加密套件以外的完整信息
如果你理解了我刚才讲的服务端的相关解释,那么这个客户端的就一目了然了,客户端加载了别名为client的私钥作为自己的证书,信任了别名为server的证书。
通过这些信息,你可以明确知道自己的程序到底加载了那些证书,信任了哪些证书,这些信息对于故障排查至关重要。
由于篇幅原因,本篇文章到此为止,下一篇文章中我将结合上面JVM参数以及Wireshark抓包两种方式来具体分析整个握手过程。
如果您觉得我的文章对您有帮助,请点个赞或者转发此文章,感谢您的支持!
领取专属 10元无门槛券
私享最新 技术干货