在使用Burp Suite抓取手机App的HTTPS流量时,常因SSL证书信任问题导致抓包失败。典型表现为客户端抛出“SSL handshake failed”或“Certificate not trusted”错误。此问题多源于App内置了证书绑定(Certificate Pinning)机制,或系统/应用未正确信任Burp生成的CA证书。即使已在手机中安装Burp证书,Android 7及以上版本的应用默认不信任用户证书,需将证书移至系统受信任凭据才能生效。此外,部分应用使用双向认证或检测代理环境,进一步阻碍正常抓包。如何绕过证书锁定并确保Burp证书被目标App信任,成为移动安全测试中的关键难点。
1条回答 默认 最新
Qianwei Cheng 2025-11-10 09:28关注一、问题背景与核心挑战
在移动应用安全测试中,使用Burp Suite抓取HTTPS流量是常规操作。然而,由于现代App普遍采用安全增强机制,导致抓包失败的情况频繁发生。最典型的错误提示包括“SSL handshake failed”和“Certificate not trusted”,其根源主要集中在以下三个方面:
- 证书绑定(Certificate Pinning):App将特定服务器证书或公钥硬编码,拒绝接受任何第三方CA签发的证书,包括Burp生成的中间人证书。
- Android系统信任模型变化:自Android 7(API 24)起,默认情况下应用不再信任用户安装的CA证书,必须将Burp CA证书移至系统级受信任凭据目录。
- 代理检测与双向认证:部分App通过检测环境变量、网络延迟、证书指纹等方式识别代理行为;少数金融类App甚至启用mTLS(双向TLS),要求客户端提供有效证书。
二、分层分析:从基础到高级障碍
层级 技术点 影响范围 典型表现 1 未安装Burp CA证书 所有Android/iOS设备 Certificate not trusted 2 证书为用户凭据,非系统级 Android 7+ 仅部分App可抓包 3 证书绑定(OkHttp, Network Security Config) 主流金融、社交App SSL handshake failed 4 动态Pinning + 公钥哈希校验 高安全性App(如银行) 连接立即中断 5 代理检测(Proxy Detection) 反调试加固App 功能受限或闪退 6 mTLS(双向认证) 企业级通信App handshake_failure alert 三、解决方案路径图谱
# 常见绕过步骤概览 1. 导出Burp CA证书(cacert.der)并转换为系统兼容格式 2. 将证书推送至Android设备 /system/etc/security/cacerts/ 3. 修改文件权限:chmod 644 <hash>.0 4. 使用Frida或Xposed框架Hook SSL相关API 5. 利用Magisk模块自动注入系统证书 6. 动态Patch APK,移除CertificatePinner调用 7. 启动App时附加Frida脚本禁用pinning逻辑 8. 配合Objection等工具实现自动化绕过四、实战案例:Android App证书绑定绕过流程
graph TD A[启动Burp Proxy] --> B[配置手机代理指向Burp] B --> C[导出Burp CA证书为DER格式] C --> D[转换为PEM并计算Subject Hash] D --> E[重命名为<hash>.0] E --> F[Root设备后推送到/system/etc/security/cacerts/] F --> G[设置权限: chmod 644 <hash>.0] G --> H[尝试抓包观察是否仍报错] H -- 失败 --> I[判断是否存在Certificate Pinning] I --> J[使用APKTool反编译目标APK] J --> K[搜索'CertificatePinner', 'pins='关键字] K --> L[定位OkHttpClient构建处] L --> M[修改smali代码移除pinner设置] M --> N[重新打包并签名APK] N --> O[安装测试并验证抓包成功]五、高级技巧:基于Frida的运行时Hook方案
对于无法静态修改的加固App,可采用动态插桩方式。以下为通用Frida脚本片段,用于绕过OkHttp的证书绑定:
Java.perform(function () { var CertificatePinner = Java.use('okhttp3.CertificatePinner'); CertificatePinner.check.overloads.forEach(function (overload) { overload.implementation = function (hostname, chain) { console.log("[*] Bypassing CertificatePinner for " + hostname); return; }; }); });该脚本通过拦截
CertificatePinner.check()方法调用,直接返回而不执行实际校验,从而实现运行时绕过。适用于大多数基于OkHttp实现pinning的应用场景。六、iOS平台特殊处理策略
iOS系统同样存在类似限制,但解决路径略有不同:
- 需在设置中手动启用已安装的Burp证书为“完全信任”状态。
- iOS 10.3+要求在“设置 → 通用 → 关于本机 → 证书信任设置”中开启对特定CA的信任。
- 对于启用ATS(App Transport Security)且配置严格规则的应用,可能需要越狱后使用SSLKillSwitch2工具全局禁用SSL验证。
- 利用frida-ios-dump等工具提取IPA并分析NSURLSessionConfigurations中的pinned domains。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报