关于Whistle抓包HTTPS的疑问
Whistle在当前工作中挺常用,同时大部分站点已开启HTTPS,而为了能够正常的代理操作这些站点,Whistle需要进行一些设定。
但有时会出现状况,比如抓不到请求等,搞清楚背后的原理/设计有益于解决相关问题。因此这里Mark下。
Chrome开发者工具下:开头的头部字段
在Chrome下查看请求时发现HTTPS下的请求有几个特殊字段
HTTPS请求头部
- 这几个字段叫伪首部字段
Pseudo-Header Fields
, - HTTP/1.x使用消息起始行( [[RFC7230]](http://httpwg.org/specs/rfc7540.html#RFC7230),[3.1节](http://httpwg.org/specs/rfc7230.html#start.line) )表达目标URI。对于同样的目的,HTTP/2使用以’:’字符(ASCII 0x3a)开始的特殊的伪首部字段来表示请求的方法和响应的状态码。
HTTP请求头部
x前缀字段
如果想在HTTP头里添加自定义的字段,为了和标准字段区分,之前是建议加上
X-
前缀的(X
代表Extension)。这个建议是在1982年为Email标准提出(参考RFC-822),行之有效了几十年。经常看到的自定义字段比如
X-Powered-By
2012年6月,互联网工程任务小组(IETF)发布了新的征求意见稿(RFC-6648),要求自定义HTTP头字段应放弃使用X-
前缀。
如果完全是私有自定义字段且不可能标准化,推荐名称包含组织名(如反域名com.example.foo
)
header name大小写
Header字段大小写是不敏感的,因此在实际开发中可以按照个人习惯去写。
Each header field consists of a name followed by a colon (“:”) and the field value. Field names are case-insensitive.
Whistle抓包HTTPS下的三个设定
Capture TUNNEL CONNECTS
Enable HTTP/2
CA
当我们下载证书=>安装证书=>信任证书
,证明最终work的标志即如下访问时,查看查看证书签发机构变成了whistle。
MitM
如果不对HTTPS请求进行解密,代理环节也只是可以看到域名,请求具体信息及响应信息是无法正确解析查看的,因为SSL加密的原因。而Whistle,或者其它代理软件Surge都是采用MitM来解决抓包问题。
为什么MitM可以解决是因为MitM是利用自签证书来与原服务端/客户端同时与双方进行通讯。
Capture TUNNEL CONNECTS
该选项如果不开启是无法获取HTTPS请求体/响应体内容的。
为什么这里叫TUNNEL CONNECT?
- 隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序
- Tunnel是个抽象概念,针对HTTPS请求来说,浏览器被代理,则请求会先发送HTTP请求-Connect方法到代理服务器创建隧道
Enable HTTP/2
如果关闭该设定,在Whistle中显示的HTTP版本信息还会是1.1,出现错误
Whistle抓包不work
Network看不到相关请求
一般是这些请求并没有走到Whistle代理,比如最近我遇到的一个情况。
我的网络环境如下
系统代理工具为Surge,Chrome下请求会先走Surge,然后被分发到Whistle8899端口代理。但最近发现192.168内网IP服务都无法抓包,最后定位是Surge中有skip proxy配置,内网IP,Surge代理会直接跳过,那更不用说走到Whistle了。
因此遇到此类情况,需要关心的是请求到Whistle代理是不是配置正确
Rule不work
在network下查看对应请求下的信息,如果没有匹配rule显示,则证明rule配置无效。
当前whistle对于rule配置并没有进行有效性check。
延伸
nginx http2
Nginx无法在同一端口多服务情况下提供多种不同的协议。即比如443端口挂了多个服务配置,彼此只是根据域名来区分,但只要在其中一个服务下配置HTTP2,则对外即都是HTTP2协议。
写在最后
以上问题搞清,在排查whistle代理抓包/解析问题就会相对清晰些,也能更好的使用Whistle。