zoukankan      html  css  js  c++  java
  • 使用Wireshark查看HTTPS中TLS握手过程

    通过使用Wireshark抓包分析TLS握手的过程,可以更容易理解和验证TLS协议,本文将先介绍Wireshark解密HTTPS流量的方法,然后分别验证TLS握手过程和TLS会话恢复的过程。

    一、使用Wireshark解密HTTPS流量的方法

    TLS对传输数据进行了加密,直接使用Wireshark查看,TLS协议之上的协议细节(应用层 HTTP)完全看不到,因此需要解密后,才能查看。解密方法如下:

    1.在Wireshark官网下载系统对应的Wireshark安装包,进行安装

    2.增加系统环境变量设置(计算机 -- 右键 -- 属性--高级系统设置--高级--环境变量--系统变量--新建)

    变量名:SSLKEYLOGFILE

    变量值:%USERPROFILE%sslkeysENV.pms

    3.在CMD使用命令行启动chrome浏览器

    "C:Program Files (x86)GoogleChromeApplicationchrome.exe" --ssl-key-log-file=%USERPROFILE%sslkeysARG.pms

    4.设置Wireshark

    (1)打开Wireshark--编辑--首选项--Protocols--SSL

    (2)设置(Pre)-Master-Secret log filename

    C:Users用户名sslkeysARG.pms  (路径 就是 %USERPROFILE%的值)

    (3)设置SSL debug file (此步骤可选,用来记录解密的日志)

    C:Users用户名ssl.log (路径 就是 %USERPROFILE%的值)

    5.此时便可以在Wireshark中查看HTTPS的流量了

    下面是解密前后对比图:

    二、完整的TLS握手过程

    上图是完整的TLS握手的过程,TLS运行在传输层协议之上,蓝色的部分是TCP握手阶段。假设服务器与客户端的传输时间是28ms。我们通过Wireshark的抓包来逐条分析:

    1. 在0ms,客户端发送SYN分组开始TCP握手;

    2. 在28ms,服务器响应SYN-ACK分组;

    3.在56ms,客户端确认SYN-ACK;

     同时,立即发送Client Hello,也是TLS握手的第一步,将TLS的版本、所支持的加密套件列表、支持或希望的使用的TLS扩展选项发送给服务器。

    其中server_name 为SNI(Server Name Indication,服务器名称指示)扩展,与HTTP中Host首部相似,在握手之初就指定要连接的主机名。对于相同IP服务不同域名的情况,就可以使用SNI区分不同的域名。

    其中Application Layer Protocol Negotiation 为ALPN应用层协议协商扩展,在TLS握手的同时协商应用协议,节省HTTP Upgrade机制带来的额外的往返时间。

    4. 在84ms,服务器发送Server Hello,Certificate,(Server Key Exchange),Server Hello Done

    服务器取得TLS协议版本用于之后的通信,从客户端提供的加密套件里选择一个,选择HTTP协议版本,附上自己的证书,发送给客户端。作为可选项,服务器也可以发送一个请求,要求客户端提供证书及其他TLS扩展参数。

    5. 在112ms,客户端发送Client Key Exchange,Change Cipher Spec,Finished

    客户端生成一个新的对称密钥,用服务器的公钥加密,发送给服务器,告知服务器可以开始加密通信了。

    6. 在140ms,服务器端发送(New Session Ticket),Change Cipher Spec,Finished

    服务器解密出客户端发来的对称密钥,通过验证消息的MAC检查消息的完整性,再返回给客户端一个加密的“Finished”消息。因为是第一次建立会话,还发送了New Session Ticket。

    7. 在168ms,开始传输应用层数据。

    三、简短的TLS握手过程

    为了节省握手往返次数,TLS提供了恢复功能,通过服务器端的会话标识符或客户端的会话记录单机制,也被称为会话缓存或无状态恢复机制,减少协商次数。

    1. 在0ms,客户端发送SYN分组开始TCP握手;

    2. 在28ms,服务器响应SYN-ACK分组;

    3.在56ms,客户端确认SYN-ACK;

     同时,立即发送Client Hello,也是TLS握手的第一步,将TLS的版本、Session ID、所支持的加密套件列表、支持或希望的使用的TLS扩展选项发送给服务器。

    4. 在84ms,服务器发送Server Hello,Change Cipher Spec,Server Hello Done

    5. 在112ms,客户端发送Change Cipher Spec,Finished

    同时,立即可以传输应用层数据。

    参考资料:

    1.https://hpbn.co/

    2.https://stackoverflow.com/questions/42332792/chrome-not-firefox-are-not-dumping-to-sslkeylogfile-variable

    3.https://imququ.com/post/http2-traffic-in-wireshark.html

  • 相关阅读:
    【Ogre编程入门与进阶】第二章 Ogre相关知识回顾 【转载】
    Ogre1.7.2 + CEGUI0.7.5环境配置 【转载】 需要配制出自己的基础环境
    JS_模拟广告栏跟随效果
    JS_模拟电商网站放大镜效果
    JS_图片轮播事件
    JS_DOM事件之鼠标事件之随鼠标移动
    JS_DOM之小球随鼠标移动事件
    JS_DOM事件温习
    JS_原型和继承之小案例
    JS_生成随机矩形位置/矩形大小_面向对象_原型+构造函数模式
  • 原文地址:https://www.cnblogs.com/fanyegong/p/12212692.html
Copyright © 2011-2022 走看看