Android 7.0 (API 24 )以下,你可以直接使用 Charles 安装相关证书配置好代理后实现抓包功能,本文主要讲android7.0以后如何实现抓包功能:
首先下载安装Charles工具:
官方下载网址:https://www.charlesproxy.com/download/
这里引用别人如何安装破解版的方法:别人的博客
首先通过 https://www.zzzmode.com/mytools/charles
下载charles的jar包
替换掉本地名为charles.jar的jar包:
macOS:/Applications/Charles.app/Contents/Java/charles.jar
Windows: C:\Program Files\Charles\lib\charles.jar
Charles的基本设置:
1、在电脑上安装证书,windows不清楚没尝试,mac本安装Charles证书
会出现下面的图,因为我已经信任所以是蓝加号,你打开应该是红色的X,双击打开选择始终信任,然后输入你的电脑密码即可,就会变成我的这样子,这就安装好了;
2、在电脑上保存加密证书文件
注意:⚠️这个证书后面会用到;
3、设置ssl代理
Proxy --> SSL Proxying Settings 弹出一个ssl代理设置界面
然后将Enable SSL Proxying复选框打上勾
添加你想要的设置代理的域名(使用*表示不过滤), 端口默认443(也可以直接点击add确认或者host和port都输*确定)
4、设置访问域名和端口(这一步不设置也是可以的,默认端口号是8888)
Proxy --> Proxy Settings 弹出一个端口设置界面
android项目里面的配置:
2、network_security_config.xml 里面添加内容:(请求域名和证书文件可以添加多个)
关于这里的代码可以参考官方文档写不同的功能实现:官网文档
请求域名
请求域名 - 为你项目请求接口所用到的域名(如:server.xxxx.com)
证书名称 - 为上面提到的在charles里面点击”Save Charles Root Certificate..”(路径: Help - SSL Proxying -Save Charles Root Certificate.. )
3、在AndroidManifest.xml文件需要加入以下配置: (注意名字和你上面创建的xml文件名一致)
添加这行代码:android:networkSecurityConfig="@xml/network_security_config"
手机证书安装和代理的设置:
手机证书一般需要自己手动安装,通过上述方法并不能直接安装,在浏览器中访问http://chls.pro/ssl下载证书,有些人说需要将证书后缀修改cer,但是我遇到的是不需要管后缀,pem也是可以。注意下保存地址;
安装证书各手机不太一样,你找安装证书,这里提供两个我知道的:
1、WLAN -->更多-->高级WLAN设置--> 安装证书 --> 选择刚才下载的证书(这里会出现让你设置手机锁屏密码,自行设置)
2、更多设置/高级设置 --> 安全隐私 --> 安装证书 --> 仿照上面
最后再说一种抓包方法,这种方法的网络请求必须基于OkHttp,Charles 安装设置还是参考上面流程,接下来就是在封装网络请求处做一下处理:注意⚠️:最后这个方法设置会覆盖上面xml的设置方法,原因应该很明显,这个是直接在请求处做的证书验证;
//配置多个证书,有请求证书、抓包证书
try {
setCertificates(sOkHttpClient, new InputStream[]{mContext.getAssets().open("cer/app_master.cer")
, mContext.getAssets().open("cer/zyt_charles.pem")});
} catch (IOException e) {
e.printStackTrace();
}
/**
* 通过okhttpClient来设置证书
*
* @param clientBuilder OKhttpClient.builder
* @param certificates 读取证书的InputStream
*/
public void setCertificates(OkHttpClient.Builder clientBuilder, InputStream... certificates) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory
.generateCertificate(certificate));
try {
if (certificate != null)
certificate.close();
} catch (IOException e) {
}
}
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:"
+ Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
clientBuilder.sslSocketFactory(sslSocketFactory, trustManager);
} catch (Exception e) {
e.printStackTrace();
}
}
到这里就完成了抓包的需求,要是还不能抓包成功,那你该认真检查自己是不是哪里写错了或者二次无效证书覆盖正确证书配置。