🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 一套基于平台的代理服务器,与平台无缝整合,可以使用平台所有基础设施,并提供二次开发接口,以实现特定的业务逻辑; ![](https://img.kancloud.cn/f0/ac/f0ac2b1a4adcb7017cc23dc104944437_839x566.png) 支持级联代理服务器,更方便业务的场景规划设计,实现更复杂的业务逻辑; ![](https://img.kancloud.cn/c0/58/c05843fcd8c82ccd44f44bd4f61c3f14_1029x568.png) ## 二、应用场景 这里实现了自己的网络服务中间容器,那么,所有的需要通过网络协议实现的业务监控,报文监控和行为监控等都可以实现了; 例如,流量统计、限速、安全行为审计、数据抓包分析、网络安全监控等,都可以在这个容器中实现; ## 三、二次开发 平台提供了一个定制业务干预的接口UniFullResponseIntercept,只要实现它,并将实现类配置到配置文件中server.proxyserver.logic.clazz即可; 下面举实际例子(也是平台内置的默认实现)来说, ``` public class DefaultLogic extends UniFullResponseIntercept { @Override public boolean match(HttpRequest httpRequest, HttpResponse httpResponse, HttpProxyInterceptPipeline pipeline) { return ProxyServerUtil.isCurrentResponseJson(httpResponse);// HttpUtil.checkUrl(pipeline.getHttpRequest(), ".*jinritemai.com.*") && HttpUtil.isHtml(httpRequest, httpResponse); } @Override public void handleResponse(HttpRequest httpRequest, FullHttpResponse httpResponse, HttpProxyInterceptPipeline pipeline) { ProxyLog log = new ProxyLog(); log.setGENERATE_TIME(DateUtil.getDateStr(100)); log.setRESPONSE_BODY(httpResponse.content().toString(Charset.defaultCharset())); log.setRESPONSE_HEADER(httpResponse.headers().toString()); log.setRQEUST_ADDR(httpRequest.uri()); log.setRQEUST_HEADER(httpRequest.headers().toString()); serviceLocator.getTransactionalDao().add(log); } } ``` 纳入配置: ``` server.proxyserver.logic.clazz=org.wbase.framework.server.proxy.logic.DefaultLogic ``` >[info] 上述默认实现,就是把代理服务器中,所有客户端请求的目标服务器网站的数据包记录下来到日志表中; ## 四、配置项 平台对代理服务器,设定了如下配置项; ``` server.proxyserver.loadedctx= server.proxyserver.loglevel=warn server.proxyserver.port=9999 server.proxyserver.cert.download.enable=false server.proxyserver.catch.content.type=json server.proxyserver.logic.clazz=org.wbase.framework.server.proxy.logic.DefaultLogic server.proxyserver.log.keep.timelimit=5 server.proxyserver.preproxy.enable=false server.proxyserver.preproxy.type=http server.proxyserver.preproxy.host=127.0.0.1 server.proxyserver.preproxy.port=3309 ``` server.proxyserver.port,设定当前代理服务器运行的端口; >[danger] > 1、支持前置代理,就是代理服务器自身,使用另外一个代理服务器; > 2、基于前置代理,可以实现代理级联(理论上支持无限级级联,但实际支持一级就能解决集群问题),实现代理集群了; ## 五、PC浏览器使用代理服务器 首先、浏览器共享代理设置,如 ![](../../../images/screenshot_1624850814061.png) 地址填写当前您运行代理服务器的计算机外网IP地址,端口为您上面配置项中配置的端口地址; 然后、要把证书导入到客户端的浏览器中受信任机构证书中去; ![](https://img.kancloud.cn/7a/0d/7a0deb2a3218bcb47031b15b5516311f_1361x697.png) ![](https://img.kancloud.cn/64/b7/64b7806deba2467bb4ff383f6495030c_592x603.png) ![](https://img.kancloud.cn/45/34/45344e76e64cc49dd536456e02d1962a_618x635.png) ![](https://img.kancloud.cn/0e/ae/0eaecb26994ab22d95c2ca00354b1045_618x635.png) 这里,需要导入证书,那么这个证书从哪里获取呢? ``` http://代理服务器IP:代理服务器端口 ``` ![](https://img.kancloud.cn/9b/31/9b31ea6b0283ed52f98e71337df756be_1366x736.png) 即可下载该证书了; 到这里,就完成了完整的使用流程,当您的浏览器配置好代理服务器之后,访问的所有数据,都会留下记录了; ## 六、手机应用使用代理服务器 ### **快速开始** ![](https://img.kancloud.cn/15/de/15de023204b68647f6fa99f0503a878e_296x487.png) 下载证书:访问PC端部署的Fiddler,通过手机浏览器,访问地址: http://【fiddler电脑IP地址】:【fiddler设置的端口号】,例如本例中的http://192.168.253.1:8888; ![](https://img.kancloud.cn/e1/6b/e16bb5451c334e41bcd93704e4cfd8f6_291x503.png) ![](https://img.kancloud.cn/b3/27/b32783aba701b8f698f1bf3c3ad677eb_300x502.png) 安装证书: 手机打开设置—安全和隐私—凭据存储—从SD卡安装,选择步骤4中下载的证书,进行安装,完成;或者是直接点击证书,命名,即可; 设置完毕,通过手机打开应用,就能被抓包了; > 特别注意: > Android 7以及以上,系统不再信任用户安装的证书,Android 7之前的版本把CA安装到用户证书下即可,所以为了能正常抓包,需要把ca证书安装到系统证书下; ### **SSL PINNING** SSL PINNING技术在开发时就将服务端证书一块打包到客户端里。这样在HTTPS建立时与服务端返回的证书比对一致性,进而识别出中间人攻击后直接在客户端侧中止连接; 实际上,即使是这样,也是有办法解决的; > 如:root安卓机,然后安装Xposed和其JustTrustMe,再进行代理设置抓包即可,相对来说,麻烦一点;参考:[SSLPinning](%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/SSLPinning.md) ## 七、其他 证书及https的知识,可以参考: [https](%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/https.md)