Android7.0以上使用Charles抓包Https

本文详细介绍了在Android 7及以后版本中遇到的HTTPS抓包问题及其解决方案。由于Google更改了安全策略,用户添加的CA证书无法再用于安全连接,导致Charles等工具抓包失败。文中提供了两种解决方法:一是仅限于抓取自身APP的包,二是通过Root设备并将Charles证书安装为系统证书,实现全面抓包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到的问题

由于Android7以后google更改了安全策略,用户添加的CA证书不能再用于安全连接,意思就是你自己安装的Charles的证书也没有卵用了。当我们抓HTTPS的包时候会出现下面的问题

设备上伴随会出现下面的log

2019-02-11 14:27:12.232 8913-8954/? W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.232 8913-8954/? W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:361)
2019-02-11 14:27:12.232 8913-8954/? W/System.err:     at com.android.okhttp.Connection.connectTls(Connection.java:235)
2019-02-11 14:27:12.232 8913-8954/? W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:199)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:172)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.example.android.sdk.http.HttpRequest.execute(HttpRequest.java:73)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at com.example.android.sdk.http.HttpRequest$1.run(HttpRequest.java:110)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2019-02-11 14:27:12.233 8913-8954/? W/System.err:     at java.lang.Thread.run(Thread.java:761)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:563)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:444)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:508)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:401)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:375)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:304)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
2019-02-11 14:27:12.235 8913-8954/? W/System.err:     at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88)
2019-02-11 14:27:12.236 8913-8954/? W/System.err:     at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:178)
2019-02-11 14:27:12.236 8913-8954/? W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:596)
2019-02-11 14:27:12.236 8913-8954/? W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
2019-02-11 14:27:12.236 8913-8954/? W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: 	... 16 more
2019-02-11 14:27:12.236 8913-8954/? W/System.err: Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.236 8913-8954/? W/System.err: 	... 28 more
复制代码

解决办法一

该方法针对未Root的设备,直接参看Android官方的文档developer.android.com/training/ar… 但是这个办法有个局限就是只能抓取自己APP的包,无法抓取第三方APP,而且操作麻烦。

解决办法二

本文章主要讲的是该方法,一个一劳永逸的方法,就是将Charles的证书安装为系统证书。

1. 确保手机已经Root

至于Root的方法我就不再累述

2. 下载证书

根据Charles的help浏览chls.pro/ssl下载证书,你可以在设备上下载后adb pull到电脑上,也可以直接用电脑浏览器下载。

3. 重命名证书

系统证书在目录/system/etc/security/cacerts/下,我们看到

其中的每个证书的命名规则是 <Certificate_Hash>.<Number>,文件名是一个Hash值,而后缀是一个数字。后缀名的数字是为了防止文件名冲突的,比如如果两个证书算出的Hash值是一样的话,那么一个证书的后缀名数字可以设置成0,而另一个证书的后缀名数字可以设置成1.

我们用下面的命令计算出证书文件的Hash值 openssl x509 -subject_hash_old -in <Certificate_File>

4. 上传证书

我们将重命名好的证书adb push/sdcard/Download,然后将其复制到/system/etc/security/cacerts/文件夹。

如果出现上面问题,那么我们就需要使用 mount -o rw,remount /system命令将system分区挂在为可读写。
还是失败请依次执行下面命名:

adb root
adb disable-verity
adb reboot
adb remount
adb shell
mount -o rw,remount /system
复制代码

复制好后将文件权限更改为644,并重启设备

5. 验证结果

设置》安全》信任的凭证,我们可以看到

HTTPS抓包我们可以看到

转载于:https://juejin.im/post/5c611302f265da2ddc3c5622

当您在尝试对运行安卓7.0及以上版本的设备进行抓包操作时遇到失败的情况,这通常涉及到几个可能的问题: 1. **权限限制**:安卓系统对于应用的网络访问进行了严格的权限控制。为了进行网络抓包操作,您的应用程序需要获取特定的权限。如果应用程序未在AndroidManifest.xml文件中声明必要的权限,或是用户拒绝了相应的权限请求,那么抓包功能将无法正常工作。 - 需要在`<manifest>`标签内添加`<uses-permission>`元素,例如: ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WIFI_DEBUGGING" /> ``` - 用户在安装应用时,可能会看到一个弹出窗口提示关于获取某些权限的必要性,并询问是否允许。确保用户正确地授予了所有必需的权限。 2. **开发者工具限制**:部分开发者工具可能受限于操作系统或安全策略。例如,某些工具可能无法通过标准API直接访问网络数据流,而需要使用特殊的方法或绕过常规机制,如使用root权限或其他非官方手段。然而,在安卓上,这样做可能存在风险并违反隐私政策。 3. **防火墙规则**:设备上可能已经配置了防火墙规则,阻止了特定应用的网络通信。检查防火墙设置,确认是否存在针对您的应用的禁止规则。 4. **应用自身限制**:有时,问题可能出现在应用本身的实现上。比如,代码中有错误、逻辑漏洞,或者是资源加载、初始化不当等导致应用无法正常获取网络数据。仔细审查应用的网络访问代码,查找可能的异常处理不足或资源管理问题。 5. **兼容性和稳定性**:安卓7.0引入了一些新的安全特性,可能导致一些较旧的应用或库无法完全兼容。确保使用的依赖库和框架都支持最新的安全规范。 解决上述问题的一般步骤包括: - 确认应用已正确声明所需权限并在设备上获得授权。 - 检查网络访问相关的代码,确保没有逻辑错误或资源泄漏。 - 使用开发者文档和社区资源验证是否有兼容性或权限方面的更新信息。 - 调试日志和性能监控工具可以帮助定位问题所在。 如果您正在使用的是某个特定的开发者工具或库,可以查阅其官方文档或论坛,寻求更具体的解决方案和最佳实践建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值