Earth Guardian

You are not LATE!You are not EARLY!

0%

Fiddler 抓包工具

使用 Fiddler 工具抓包,分析网络状态。

Fiddler 安装

Fiddler 的安装非常简单,只是抓取 Https 时需要安装证书,可能会存在些问题。

下载并安装

官网 下载 Fiddler Classic 基础版本,选择自己的目录安装;安装成功后,运行 Fiddler 工具,打开浏览器后,可以看到所有的网络请求都通过 Fiddler 代理并访问,但是 Https 相关无法查看信息。
因为 Https 连接需要证书校验,所以使用 Fiddler 做代理时,需要正确安装 Fiddler 的证书。

导出 Fiddler Https 证书

Fiddler 打开后,在 Tools -> Options -> Https 界面,勾选 Decrypt HTTPS traffic ,此时会提示是否重新生成证书并导入 Windows ,选择“否”!这里很容易出现后续的证书校验问题,选择否后,手动导入 Fiddler 证书。

0120-check-decrypt-https-traffic

勾选 Decrypt HTTPS trafficIgnore server certificate errors(unsafe) 后,导出 Fiddler 证书到桌面,文件名为 FiddlerRoot.cer

0120-export-root-certificate-to-desktop

Windows 中安装 Fiddler 证书

双击导出的 FiddlerRoot.cer 证书文件,选择“安装证书”:

0120-fiddler-root-cer-install-1

安装过程中,“将所有的证书都放入下列存储” 选择 “受信任的根证书颁发机构” !!

0120-fiddler-root-cer-install-2

导入成功后,可以通过 win+R 输入 certmgr.msc 打开证书管理器,分别在 “个人,受信任的根证书颁发机构,中间证书颁发机构” 三个地方的证书中,查找到 DO_NOT_TRUST_FiddlerRoot 这个证书,表示 Fiddler 证书导入成功了。

0120-certmgr-fidder-root-cert

如果三个地方有的没有这个证书,鼠标右键选择 “所有任务 -> 导入” ,手动导入刚才的证书文件,导入完成后再查看是否包含 DO_NOT_TRUST_FiddlerRoot 证书。

Chrome 浏览器中安装 Fiddler 证书

WindowsFiddler 证书安装成功后,我们希望通过 Chrome 浏览器查看网页,可以检查 Chrome 中证书是否同步安装成功。
打开 Chrome -> 设置 -> 隐私设置和安全性 -> 管理证书

0120-chrome-certmanager

同样,在 “个人,受信任的根证书颁发机构,中间证书颁发机构” 三个地方的证书中,查找是否包含 DO_NOT_TRUST_FiddlerRoot 证书,如果没有手动导入证书。

0120-chrome-certmanager-check-2

安装完毕后,重新打开 Fiddler 软件和 Chrome 浏览器,输入 https://www.baidu.com/ 正常打开,表示证书正确安装并能通过 Fiddler 抓包!!
如果提示 ERR_CERT_AUTHORITY_INVALID 表示证书不匹配,在上面所有包含 DO_NOT_TRUST_FiddlerRoot 证书的地方,将该证书删除,重新导出证书再走一遍导入流程。

手机通过 Fiddler 抓包

使用 Fiddler 对手机端抓包时,也需要在手机中导入证书;如果 AppOkHttp 来连接时,需要实现 sslSocketFactory,hostnameVerifier ,通过所有证书校验。

Fiddler 允许远程连接

打开 Fiddler -> Tools -> Options -> Connections 勾选 Allow remote computers to connect ,允许手机远程连接到 Fiddler

0120-fiddler-connections-remote-computer

手机 Wifi 连接时设置 Fiddler 代理

Fiddler 工具中,查看对应 IP ,代理的端口为 8888

0120-fiddler-ip

因为是局域网代理,所以手机端和 Windows 电脑必须处于同一个局域网,通常连接同一个 Wifi 就行。打开该 Wifi 设置手动代理及端口:

0120-phone-wifi-proxy

设置完代理后,手机端的所有请求都能在 Fiddler 中查看到了;如果需要查看 Https 的请求,需要在手机端安装 Fiddler 证书。

手机浏览器下载 Fiddler 证书

Fiddler 代理的 Wifi 连接成功后,打开浏览器,输入 IP:port 下载 Fiddler 证书。比如在 UC 浏览器输入 192.168.47.236:8888 下载并安装证书

0120-phone-download-fiddler-root-cert

下载完成后,点击该证书文件并安装

0120-phone-install-fiddler-cert

安装成功后,在手机 “设置 -> 安全性和位置信息 -> 加密与凭据” 这个界面:“用户凭证” 中可以找到刚才安装的凭证;“信任的凭据 -> 用户” 中,可以找到 DO_NOT_TRUST_FiddlerRoot 证书!!

0120-phone-fiddler-root-cert

手机端 Fiddler 证书安装完毕!!

OkHttp 中校验

手机 App 在做网络请求中,如果使用 OkHttp 请求 Https 连接,需要重写 sslSocketFactory,hostnameVerifier ,确保证书能校验通过!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
okHttpClient = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(), mMyTrustManager)
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
.build();


private static MyTrustManager mMyTrustManager;

private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
mMyTrustManager = new MyTrustManager();
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{mMyTrustManager}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception ignored) {
ignored.printStackTrace();
}

return ssfFactory;
}

//实现 X509TrustManager 接口
public static class MyTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}

验证

修改完 App 后,重写打包安装,并连接 Fiddler 后,发出 HTTPS 请求,查看是否能正确解析数据。

0120-phone-fiddler-check

常见问题

Fiddler 证书重置

Fiddler 工具重置证书后,一定要将 Windows,Chrome 以及手机端中对应的证书删除后重新导入,否则会因为证书校验失败,HTTPS 无法连接,出现 ERR_CERT_AUTHORITY_INVALID
可能会重置证书的常见操作:

0120-fiddler-reset-cert

显示 WebSocket 工具栏

如果双击 websocket 建立的连接,没有看到 WebSocket 工具,修改方式为:
工具栏 Rules --> Customize Rules... ,打开后,添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Handlers
{
...
// 添加这段代码
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
// Log Message to the LOG tab
FiddlerApplication.Log.LogString(oMsg.ToString());
}

public static RulesOption("Hide 304s")
BindPref("fiddlerscript.rules.Hide304s")
var m_Hide304s: boolean = false;
..
}

参考文档