为什么我的Charles配置好了却抓不到手机的HTTPS请求?

UE丶玉宁 阅读 16

我按教程配置了Charles的HTTPS代理,手机也设置了代理并安装了证书,但访问App时请求还是显示“Connection refused”。

/* 我在App的WebView里看到的错误样式 */ .error { color: red; }

网页请求能抓到,App的请求却全都是红叉,证书里也勾选了对应App包名,到底哪里出问题了?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
雅涵 Dev
大概率是App用了SSL Pinning防抓包,这种安全机制会校验证书链,Charles的证书过不了验证。你得用Frida或者Objection绕过Pinning,像这样安装个Objection: pip3 install objection 然后运行 objection explore 再试下抓包。我之前也被坑过好几次,现在遇到HTTPS抓不到基本都是这原因。
点赞
2026-02-16 20:05
技术树泽
这个问题太常见了,我之前在调试公司App的时候也卡过两天,最后发现是几个细节没注意。我们一步步来排查,先说最常见的原因。

首先你提到网页请求能抓到,说明Charles的基础代理配置没问题,手机网络也通,问题出在App的HTTPS通信上。Connection refused 红叉一般是SSL握手失败或者App本身做了证书校验。

第一步,确认手机和电脑在同一局域网,并且Charles的代理端口(默认8888)没有被占用。你在Charles里打开 Proxy → Proxy Settings,确认端口是8888,勾选了Enable transparent HTTP proxying。然后手机Wi-Fi设置里手动代理填的是你电脑的局域网IP,不是localhost也不是127.0.0.1。

第二步,证书安装要特别小心。你得在手机浏览器里访问 chls.pro/ssl 下载并安装证书。iOS要注意在设置 → 通用 → 关于本机 → 证书信任设置里把Charles的证书打开信任。Android不同系统位置不一样,比如小米在“更多设置”→“系统安全”→“加密与凭据”→“信任的凭据”里安装,然后还得在应用层面开启用户证书信任。

这里需要注意,现在很多App为了安全,会做SSL pinning(证书绑定),也就是说它不认系统证书,只认自己打包进来的证书。这种情况下就算你装了Charles证书也没用,App会直接拒绝连接,报Connection refused。

解决办法是绕过SSL pinning。如果你有App的测试包,可以用工具处理。比如Android可以用JustTrustMe这个Xposed模块,或者用Frida注入脚本。举个Frida的例子:

// bypass-ssl-pinning.js
Java.perform(function () {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function (hostname, certificates) {
console.log('[*] Bypassing CertificatePinner for ' + hostname);
return;
};

// 如果是用HttpUrlConnection
var SSLContext = Java.use('javax.net.ssl.SSLContext');
SSLContext.getInstance.overload('java.lang.String').implementation = function (protocol) {
console.log('[*] Bypassing SSLContext: ' + protocol);
return this.getInstance(protocol);
};
});


保存成js文件,用frida -U -f com.your.app.package -l bypass-ssl-pinning.js 启动。这样就能绕过常见的OkHttp和系统级的证书校验。

iOS的话类似,可以用trustKit或者修改dylib,但需要越狱或者用自己的证书重签App,比较麻烦。

还有一个可能是App用了Network Security Config(Android 7.0+)。它可以在xml里指定只信任系统证书,忽略用户安装的证书。这时候你需要反编译App的AndroidManifest.xml,看有没有networkSecurityConfig引用,然后去对应的xml文件里加一个debug允许用户证书的配置:

<!-- res/xml/network_security_config.xml -->
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>


然后在AndroidManifest.xml里加上:
android:networkSecurityConfig="@xml/network_security_config" 到application标签里。

但注意这只能在debug包生效,线上包可能不会这么配。

最后检查Charles的SSL Proxying Settings。你得在Proxy → SSL Proxying Settings里添加你要抓的域名,比如 . 或者具体的 api.example.com。如果不加,Charles不会解密这些Host的流量,就会显示红叉。

总结一下排查顺序:

1. 手机和电脑网络通不通,代理设对没
2. Charles证书装了没,系统里信任了没
3. App有没有做SSL pinning
4. Android有没有Network Security Config限制
5. Charles的SSL Proxying有没有加对应域名

你可以先拿一个简单的测试App试试,比如官方文档里的demo,排除是不是目标App本身的问题。慢慢来,这种问题调通了之后就一通百通了。
点赞 5
2026-02-10 15:14