介绍
在本博客中我们基于一个简单的HTTPS会话示例,展示如何通过各种加密算法等,在TLSv1.2协议规则下计算并验证各个域,为学习HTTPS协议以及实现HTTPS协议的初学者提供参考示例。
本博客示例TLS协议的基本信息如下:
- TLS版本:
TLSv1.2
; - Cipher:
TLS_RSA_WITH_AES_128_CBC_SHA
, 选择该套件的原因是其不是十分复杂,适合用于展示; - 扩展:
Extened Master Secret
:Master Secret
的计算不同于最初的TLS v1.2
RFC文档使用的方式,具体参见对应的RFC。 - 扩展:
Encrypt-then-MAC
:最初的TLSv1.2
协议使用MAC-then-Encrypt
进行消息加密和验证,但是该扩展先加密再计算摘要验证。
下面的讲解会假定你已经初步了解TLS协议的某些细节,如果遇到不清楚的概念,你随时可以参考博客HTTPS协议的正文和附录部分,包括Extened Master Secret
,Encrypt-then-MAC
扩展和PRF
等内容。
此外,下面的所有内容都可以在github仓库net-protocol-tools:demo/demo-TLS_RSA_WITH_AES_128_CBC_SHA中找到。
Setup
准备工具
此次分析实践用到的主要工具是基于Wireshark, openssl和nginx:
- Wireshark:抓取流量包,导入RSA私钥后可以解析各个加密的域;可以用来验证我们手动分析的结果;
- openssl:用于生成私钥、证书、计算摘要和加解密;
- nginx: 配置HTTPS服务器。
此次分析在Windows
上进行,其中openssl
工具使用cygwin
安装。对于Linux
或Macos
,可以使用对应的包管理器安装openssl
,版本信息:1.1.1c
。
上面的工具安装完成后,我们创建一个目录demo
并进入其中,后面的所有数据都会保存在demo
中。
openssl命令参考博客:openssl及其使用。
配置Nginx服务器和相关证书
参考另一篇博客nginx配置HTTPS实践的案例1部分,主要信息如下:
- 网址:
https://my-ssl.test:443
- 私钥:
my-ssl.test.key
- 证书:
my-ssl.test.crt
将上面的my-ssl.test.key
和my-ssl.test.crt
复制到demo
目录方便后续引用。
打开Wireshark并准备过滤数据
- 1.准备监听数据
我们将使用本地端口12443
连接到上面我们配置的nginx服务器,因此我们使用tcp.port==12443 && tls
来过滤包,如下图所示:
- 2.导入私钥进行解密
在Edit > Preferences > Protocols
下找到TLS
协议选项,按照下面的指引导入私钥:
- 3.点击Wireshark工具栏中左侧的
按钮开始进行捕获
使用openssl构造请求
打开一个命令行并切换到demo
目录,执行下面的命令:
echo -ne