wireshark开启对https密文抓包

通常情况下,wireshark只能抓取 http 的明文包,对于 https 的报文需要设置才能抓取

不设置的话,抓取到的都是 TLS 的报文,是加密了的,对调试十分困难

前言

提到 https 抓包,基本都绕不开一个 SSLKEYLOGFILE 的环境变量

SSLKEYLOGFILE 是由 Mozilla 开发团队首先引入的一个调试功能,随后被 Google Chrome 等浏览器采纳

并成为网络分析工具(如 Wireshark)的非正式行业惯例,并没有组织或者标准定义这个行为,是属于一个事实上的规范

由 wireshark + chrome 抓 https 包的原理大概就是

1、chrome 发起 https 请求的时候,会将站点的加密密钥信息存储到 SSLKEYLOGFILE 指定的文件中

2、wireshark 解析报文的时候,会从 SSLKEYLOGFILE 指定的文件中读取加密密钥信息,对加密报文进行解密

因此第三方程序请求 https 报文时,如果需要使用 wireshark 进行解密报文,那么也得需要增加对 SSLKEYLOGFILE 的支持

增加环境变量

在环境变量中增加 SSLKEYLOGFILE 变量,值指定一个 KYE 文件路径,存储 TLS(传输层安全协议)会话的加密密钥信息

配置后,并在该路径下新建该文件 KEY.LOG

配置 wireshark

打开 wireshark,在菜单 "编辑" -> "首选项" 打开配置窗口,在左侧的协议树中展开 Protocols ,并找到 TLS 项

将刚配置的 SSLKEYLOGFILE 环境变量的文件名,补充到这里来

https 抓包

设置完毕后,开启 wireshark 对网卡进行抓包,重启 chrome 浏览器,访问 https 站点

在 wireshark 的输入框中输入 http2 ,就能抓到 https 的报文了

编码中的 https 抓包

这里以 go 为例,请求 https 的参考代码,实现对 https 报文抓取的应用

这里的关键步骤,就是增加了环境变量 SSLKEYLOGFILE 的支持

go 复制代码
	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		logger.Error("new request err:", err)
		return "", err
	}
	req.Header.Set("Content-Type", writer.FormDataContentType())
	req.SetBasicAuth(username, password)

	var transport *http.Transport
	keyLogFile, err := os.OpenFile(os.Getenv("SSLKEYLOGFILE"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err == nil {
		tlsConfig := &tls.Config{
			KeyLogWriter:       keyLogFile,
			InsecureSkipVerify: true, //自签证书不校验
		}
		transport = &http.Transport{
			TLSClientConfig: tlsConfig,
		}
	}
	defer keyLogFile.Close()

	client := &http.Client{}
	if transport != nil {
		client.Transport = transport
	} else {
		client.Transport = &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //自签证书不校验
		}
	}

	resp, err := client.Do(req)
	if err != nil {
		logger.Error("http client do err:", err)
		return "", err
	}
	defer resp.Body.Close()

	b, err := io.ReadAll(resp.Body)
	if err != nil {
		logger.Error("io ReadAll err:", err)
		return "", err
	}

	logger.Info("post request reply:", resp.Status)
	logger.Info("response text:\n", string(b))
相关推荐
Lsetea16 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
2501_916008892 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
笔绘丹心4 天前
测试工程师的 BLE 抓包实战:从开关到 Wireshark 逐帧解读(红米/小米避坑版)
wireshark·抓包·ble
李纲明4 天前
WordPress 登录后跳回登录页或提示「Cookie 被阻止」:先核站点 URL 与 HTTPS 一致,再查安全插件与 CDN
https·登录·cdn·wordpress·cookie·devdiy·站点url
李纲明4 天前
WordPress 全站 HTTPS 后仍显示「不安全」或锁被划掉:先清混合内容,再核证书链与强制跳转
网络协议·安全·https·wordpress·devdiy·混合内容
Lsetea5 天前
Certbot webroot申请SSL证书总是404:Nginx挑战目录与路径映射检查
运维·nginx·https·ssl证书·certbot
山乐191315 天前
麒麟系统,安装Nginx并配置https证书
运维·nginx·https
tedcloud1235 天前
Docker Compose 部署 Uptime Kuma:配置 HTTPS、QQ 邮箱告警与数据备份
服务器·网络协议·ui·docker·容器·https·开源
嵌入式学习菌5 天前
HTTP/HTTPS、MQTT/MQTTS 区别
网络协议·http·https
cyf315 天前
第 02 篇:ARP——IP 地址到 MAC 地址的“翻译官“
tcp/ip·计算机网络·wireshark·以太网·vmware·arp·地址解析协议