大家好,又见面了,我是你们的朋友全栈君。
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL/TLS位于传输层和应用层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。
SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成”对话密钥”。
(3) 双方采用”对话密钥”进行加密通信。
首先启动WireShark并且打开浏览器,访问使用HTTPS加密的网站,浏览,抓取数据包,发现不能看到数据包的内容。(因为会话被加密了)
由于浏览器用日志文件的方式记录了用来加密TLS数据包的会话密钥,因此可以在WireShark中指定该文件来达到破解目的。
下图为一次ssl会话建立过程:
下面为抓包操作:
配置环境变量
配置Wireshark 设置文件路径
重启浏览器和WireShark 开始抓包!对抓到的包进行过滤,过滤规则:ip.addr == 23.99.125.55 && ssl
使用wireshark过滤ssl流量,可以看到有几个明显的ssl会话建立包,例如client hello,server hello等。查看抓取到的数据包的详细内容:
1、 Client Hello
不难看出,这一握手过程,客户端以明文形式传输了如下信息:
- 版本信息(TLS 1.2)
- 随机数
- Session ID(用于加快握手过程,可参考TLS会话复用)
- 加密套
- 压缩算法
- 其它一些扩展的(Extension),比如签名算法,服务器名称
2、Server Hello
这一阶段,服务端返回所选择的协议版本(Version),加密套,压缩算法,随机数,Session ID等,同时将包含自己公钥的证书发送给客户端(Certificate)。
3、数据传输经过了 SSL 握手后,服务端的身份认证成功,协商出了加密算法为 AES,密钥为 xxxxx(客户端和服务端拿三个随机值用相同算法计算出来的,并没有明文传输)。一切准备就绪。 SSL 握手成功,意味着各种应用层协议都可以加密传输。因此对之前所有握手消息进行散列运算,加密后发送给服务器。
Application Data
应用数据传输消息。因为这里是 HTTPS,所以可以对 HTTP 应用协议数据加密然后传输了。
从这里,不知道密钥是无法知道这里传输的是什么数据,连传输的是什么协议的内容都不知道。 所以之前创建 SSL 隧道,让代理服务器盲传 HTTPS 数据,就得通过 CONNECT 方法告诉代理服务器要连哪台主机,哪个端口号,要不然代理服务器也是一脸懵逼。 所以 SSL 协议是很独立的,这里是对 HTTP 进行了加密,也可以对其他协议进行加密。它就像是 TCP 和应用层协议的中间层,为上层协议提供了加密的数据传输。
Encryted Alert
SSL 警告消息,因为是加密的内容,所以单从 Wireshark 看不出警报的内容。警报消息经常只是客户端用来提示服务端 SSL 传输结束,对照抓包到的内容确实如此。所以这里只是 SSL 传输结束的一个信号。发出了 Encryted Alert 后客户端数据传输完毕,准备进入四次挥手断开 TCP 连接。尝试了好几次没找到这个数据包,可能和没正常断开连接有关。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137581.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...