怎样抓取jvm的https网络请求
用gradle构建时,常有需要去查看其网络请求,怎样抓取其网络请求呢?下面介绍gradle代理到charles上的抓包办法。
由于gradle是运行在jvm上,所以配置jvm的代理方法,即是实现了对gradle的代理,代理设置分为步:
1. 设置jvm的代理
在gradle上设置jvm的代理有两种方式
- 第一种方法,在gradle.properties中设置:
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8888
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8888
gradle在运行时自动会将属性设置加载到jvm中。
- 第二种方法,以运行参数的方式设置:
gradlew
-Dhttp.proxyHost=127.0.0.1
-Dhttp.proxyPort=8888
-Dhttps.proxyHost=127.0.0.1
-Dhttps.proxyPort=8888
代理设置完成后,发现http请求是可以在charles中正常代理查看的,但https请求却无法代理成功。原因是jvm上https的ssl握手环节证书验证不通过。由于Charles是以中间人的方式代理https请求,所以需要将charles的证书添加到jvm信任证书的列表中去。
2.添加代理证书倒jvm的证书信任列表
java工具包中集成了证书管理工具keytool,只需要用它将代理工具的证书(charles证书)导入到jvm证书信任列表中即可。
导入方法:
sudo keytool -import -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -alias certAliasName -file certPath.cert
JAVA_HOME是系统的java的安装目录。
jvm证书仓库的默认密码是“changeit”,如果修改过,请用重设的密码替换它。
certAliasName 是你给导入的证书起的名字。
certPath.cert 是导入的证书路径