- 本文主要介绍HTTPS相关概念,介绍了HTTPS就是HTTP在应用层和传输层间建立一个了TSL | SSL 连接,并使用Wireshark抓包TLS 1.2的连接(以ECDHE密钥交换算法为例)过程。
#HTTPS简介
- HTTPS (HyperText Transfer Protocol Secure),译为:超文本传输安全协议
常称为 HTTP over TLS、HTTP over SSL、HTTP Secure
由网景公司于1994年首次提出
HTTPS的默认端口号是 443 (HTTP是80)
现在在浏览器上输入 http://www.baidu.com,会重定向到 https://www.baidu.com
#SSL / TLS
背景:
HTTPS 是在 HTTP 的基础上使用 SSL/TLS来 加密报文,对窃听和中间人攻击提供合理的防护
TLS (Transport Layer Security),译为:传输层安全性协议
- 前身是 SSL (Secure Sockets Layer),译为:安全套接层
历史版本信息
SSL/TLS工作位置:
OpenSSL
OpenSSL 是SSL/TLS协议的开源实现,始于1998年,支持Windows、Mac、Linux等平台
Linux、Mac 一般自带 OpenSSL
Windows下载安装OpenSSL:https://slproweb.com/products/Win32OpenSSL.html
常用命令:
生成私钥:
openssl genrsa -out mj.key
生成公钥:
openssl rsa -in mj.key -pubout -out mj.pem
可以使用 OpenSSL 构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”
Openssl help
查看支持的相关指令(算法):
- 查看某一指令的具体用法(举例:RSA)
HTTPS的成本
证书的费用
加解密计算
降低了访问速度
- 有些企业的做法是:包含敏感数据的请求才使用HTTPS,其他保持使用HTTP(工商银行)
HTTPS的通信过程
- 总的可以分为3大阶段
- TCP的3次握手
- TLS的连接(下图中绿色部分)
- HTTP请求和响应
- 总的可以分为3大阶段
TLS 1.2 的连接(ECDHE密钥交换算法)
- TLS 1.2 的连接大概有10大步骤:(图中省略了中间产生的一些ACK确认)
Client Hello
- TLS的版本号
- 支持的加密组件 (Cipher Suite) 列表
- 加密组件是指所使用的加密算法及密钥长度等
- 一个随机数 (Client Random)
- Server Hello - TLS的版本号 - 选择的加密组件 - 是从接收到的客户端加密组件列表中挑选出来的 - 一个随机数 (Server Random) - 补充: - GEM(分组模式<一段一段加密>)
Certificate
- 服务器的公钥证书(被CA签名过的)
Server Key Exchange
- 用以实现ECDHE算法的其中一个参数 (Server Params)
- ECDHE是一种密钥交换算法
- 为了防止伪造,Server Params 经过了服务器私钥签名
Server Hello Done
- 告知客户端:协商部分结束
- 目前为止,客户端和服务器之间通过明文共享了Client Random、Server Random、Server Params
而且,客户端也已经拿到了服务器的公钥证书,接下来,客户端会验证证书的真实有效性
Client Key Exchange
- 用以实现ECDHE算法的另一个参数 (Client Params)
- 目前为止,客户端和服务器都拥有了ECDHE算法需要的2个参数:Server Params、Client Params
客户端、服务器都可以使用ECDHE算法根据Server Params、Client Params计算出一个新的随机密钥串:Pre-master secret - 然后结合 Client Random、Server Random、Pre-master secret 生成一个主密钥
- 最后利用自己的(客户端或服务器)主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等
- 然后自己再利用自己对应的密钥(客户端发送用的会话密钥)加密后对方会用与之对应的(客户端的会话密钥)密钥解密(使用的是对称加密)
Change Cipher Spec
- 告知服务器:之后的通信会采用计算出来的会话密钥进行加密
Finished
- 包含连接至今全部报文的整体校验值(摘要),加密之后发送给服务器
- 这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准
Change Cipher Spec & Finished
- 到此为止,客户端服务器都验证加密解密没问题,握手正式结束
- 后面开始传输加密的HTTP请求和响应
抓包总体流程
#使用Wireshark解密HTTPS
设置环境变量SSLKEYLOGFILE(浏览器会将key信息导出到这个文件)
- 如果环境变量不管用,可以直接设置浏览器的启动参数
- 在wireshark中加载
TLS.log
文件位置
配置Tomcat服务器HTTPS
- 生成证书
- 一个生成免费证书的网站:https://freessl.org/
- 一个生成免费证书的网站:https://freessl.org/
- 生成证书
自签生成证书:
- 环境:Tomcat9.0.34、JDK1.8.0_251
- 首先,使用JDK自带的 keytool 生成证书
- 文件名为:.jks(java key store)
keytool -genkeypair -alias sg -keyalg rsa -keystore F:/sg.jks
将证书 *.jks 文件放到 TOMCAT_HOME/conf 目录下
修改 TOMCAT_HOME/conf/server.xml 中的 Connector
- 环境:Tomcat9.0.34、JDK1.8.0_251