zoukankan      html  css  js  c++  java
  • 【参考】HTTPS流量解密

    # SSL/TLS原理

    Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商、或者响应服务器的重协商请求时会发送。

    • version:客户端支持的最佳协议版本
    • Random:共32字节,28字节随机数,4字节额外信息,受客户端时钟影响(为了避免浏览器指纹采集,现在一般会对4字节时钟做扭曲)
    • Session ID:32字节随机数,用于和服务器重建会话,为空表示新建会话
    • cipher suit:客户端支持的所有密码套件,按优先级排列
    • Compression:客户端支持的压缩算法,默认无压缩
    • Extensions:由任意数量的扩展组成,携带额外数据

    ServerHello:

    • 选择客户端提供的参数反馈客户端
    • 服务器无需支持客户端支持的最佳版本,如果服务器不支持客户端版本,可以提供其他版本以期待客户端可以接受

    Certificate:

    • 用于携带服务器X.509证书链
    • 主证书必须第一个发送,中间证书按照正确的顺序跟在主证书之后
    • 服务器必须保证发送的证书和选择的算法套件一致
    • Certificate消息时可选的

    ServerKeyExchange: 携带密钥交换的额外数据,取决于加密套件
    ServerHelloDone:服务器已将所有预计的握手消息发送完毕
    ClientkeyExchange:携带客户端为密钥交换提供的信息
    ChangeCipherSpec:发送端已取得用以连接参数的足够的信息
    Finish:握手完成,消息内容加密,双方可以交换验证,整个握手完整性所需的数据

    • 算法:verrify_data = PRF(master_secret , finished_label,hash(handshake_message))

      要解密HTTPS流量,需要得到加密密钥,加密密钥由主密钥、客户端随机数、服务器随机数生成。由上述握手过程可知,客户端随机数和服务器随机数在双方握手消息中传递,而主密钥(master_secret)则由预主密钥(pre_master_secret)结合两个随机数生成。预主密钥通过密码套件中的密钥交换算法进行交换(DH、RSA)。

      因此,通过Wireshark解密HTTPS,可以从两个地方下手:1、密钥交换算法选择RSA,然后提取服务器的私钥,将私钥导入Wireshark,通过Wireshark解密密钥交换过程中传递的预主密钥,再结合之前的客户端和服务器随机数生成主密钥,进一步生成加密密钥,即可解密后续抓取到的加密报文。2、直接从客户端提取预主密钥,结合客户端和服务器随机数生成加密密钥,实现对加密报文的解密。

    # 利用Wireshark 解密HTTPS流量

    Wireshark 原理是直接读取并分析网卡数据,解密 HTTPS 流量通常有两种方式:

    • 获取HTTPS 网站(服务端)的加密私钥
    • 某些浏览器支持将 TLS 会话中使用的对称密钥保存在外部文件中

     

    ## 一、从服务器上导出带私钥的P12格式的证书,或者直接导出服务器的私钥

    1、获取证书

      使用fiddler的中间人代理技术获取含有私钥的服务器证书:

    1).打开fiddler并启用https代理服务

    2).用配置了fiddler代理的浏览器访问百度

    3).运行”certmgr.msc“打开证书管理器

    4)从Personal/Certificates目录下找到*.baidu.com的证书,右键所有任务-导出

    2.取出证书中的私钥

    使用openssl取出私钥。

    1).将pfx证书转为pem证书

    命令行:openssl pkcs12 -in <pfx证书路径> -nodes -out <输出的pem证书路径(.pem)>

    2).从pem证书中取出私钥

    命令行:openssl rsa -in <pem证书路径> -out <输出的私钥文件路径(.key)>

    3.将私钥配置到wireshark

    3、设置Wireshark

    注:On wireshark 3, moved from SSL protocol to TLS protocol

      由于通过DH方法交换的密钥不会在中间传递,所以这种方法只能解密通过RSA交换的密钥。

    • 【首选项】-【协议】-【TLS】-【RSA keys list】设置RSA秘钥
      • IP address:服务器IP
      • Port:服务器端口
      • Protocol:被加密的上层协议(HTTP)
      • Key file:证书或私钥的存放路径
      • Password:证书加密秘钥
    • 设置过滤器开启抓包

     

    ## 二、设置环境变量截取浏览器的pre_master_secret

    Firefox 和 Chrome 都支持生成上述第二种方式的文件,具体格式见这里:NSS Key Log Format。但 Firefox 和 Chrome 只会在系统环境变量中存在 SSLKEYLOGFILE 路径时才会生成该文件

    1、添加环境变量

    • Windows
      • 打开设置环境变量窗口:systempropertiesadvanced.exe
      • 设置“SSLKEYLOGFILE”和"%USERPROFILE%sslkeysARG.pms"路径
    • Linux/MacOS

    注:使用EXPORT设置环境变量仅适用于该会话。在会话之外启动浏览器或其他Web客户端将不会设置环境变量。

          即如果使用EXPORT设置SSLKEYLOGFILE,则必须从同一会话启动Chrome。同时SSLKEYLOGFILE所指向的路径需要具有写权限的绝对路径。

      • $ export SSLKEYLOGFILE=~/path/to/sslkey.log
      • $ chmod 640 ~/path/to/sslkey.log

    2、设置Wireshark

    注:On wireshark 3, moved from SSL protocol to TLS protocol

    • 【首选项】-【协议】-【TLS】-【(Pre)-Master-Securet log filename】设置“SSLKEYLOGFILE”对应的路径
    • 设置过滤器开启抓包

    3、完全退出Chrome 或者 Firefox程序并重新运行(并指定sslkey logfile)

    • Windows:
      • "C:Program Files (x86)GoogleChromeApplicationchrome.exe" --ssl-key-log-file=%USERPROFILE%sslkeysARG.pms
    • MacOS:
      • /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --ssl-key-log-file=/path/to/sslkey.log

    4、查看Wireshark,可添加过滤:(tcp port 443)

    --------------------------------------------
    Chances are for those who are prepared.
  • 相关阅读:
    Oracle11g客户端安装记要202011+Navicat Premium 连接Oracle 数据库
    设计模式之 ==> 观察者计模式
    设计模式之 ==> 责任链计模式
    一个.NET Core下的开源插件框架
    JavaScript判断文件是否为UTF-8编码
    Postgresql 设置字段搜索支持中文排序
    springboot docker 显示中文乱码问题
    linux 更新系统时间
    怎么让网易云音乐等音乐软件的歌词在MacBook Pro的 touch bar(触摸栏)上显示
    数仓:解读 NameNode 的 edits 和 fsimage 文件内容
  • 原文地址:https://www.cnblogs.com/Michael-Scofields/p/13609306.html
Copyright © 2011-2022 走看看