Charles 代理https请求
起因
需要调用一个https服务,获取token,再携带token调用对应系统发送报文。
在postman测试中,token可以正常获取,携带token并发送GET请求也可以正常发送请求返回数据。
但是在应用程序使用中发现GET请求始终无法调用成功,response状态码405。应用使用HttpURLConnection进行请求,后续删除部分不使用的代码后居然通了。
想深入理解https请求道理经历了什么改变,从不可用变为可用。
Wireshark拦截应用程序https请求数据
最初的想法使用wireshark监控本地网络数据,找到对应https解析后观察问题原因。
跟据TLS协议握手逻辑,在wireshark中使用正确证书、密钥等方式,将请求解析。
密钥获取方式:
-
通过windwsi配置环境变量SSLKEYLOGFILE,再通过chrome浏览器导出到密钥文件中,通过wireshare导入密钥文件,进行解析。
-
通过Fiddler代理请求,然后导出证书,再通过证书生成密钥等文件信息,导入wireshare,进行解析。
可惜2种方式都没解决掉。
搜索原因,分析为tls1.2本地与服务端协商的套件为TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,现在浏览器默认使用ECDHE的加密类型,作为套件使用,wireshare无法处理此类型https请求解析。
严重怀疑:1、直接通过Fiddler就可以解决我的需求。2、Wireshark还是没用明白。
Charles安装
主要就是以下步骤:
- 安装后的注册(否则30天试用)。
- 对于SSL代理的配置,需要把浏览器授信根证书引入程序。
- 设置SSL代理的域名、端口。
postman的https请求代理
开启Charles的拦截后,发送postman直接拦截成功。
观察请求头数据,一切正常加密套件确认为TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384。
应用程序的https请求代理
开启Charles的拦截后,应用发送请求居然没显示拦截???
查了各种资料,对Charles针对性配置,仍然无效。再对windows系统进行配置仍然无效。判断应为程序问题,程序使用HttpURLConnection发送请求,发现需要设置Proxy对象,才能成功被Charles拦截。
观察后发现HttpURLConnection存在一个坑,虽然在编写过程设置了请求为GET方式,但是通过HttpURLConnection获取了输出流,虽然没有传入任何参数,请求方式在Charles中显示为POST。
思考
- Charles本质为代理或者说是中间人攻击,https请求必须流经Charles才能被拦截到,例如:A -> Charles -> 计算机网络底层 -> B。
- HttpURLConnection发送请求的方式,网络层级应该比Charles更低。
- 但是postman为什么直接能被Charles拦截?是因为网络层级与Charles一致或更高么。
- Wireshark的所处的网络层级一定比Charles低,那是否可以通过服务器证书解析请求、响应信息呢?
总结
- Fiddler确实也能解决这个问题,找到的资料是通过fiddler将https代理到另一个本地服务器,解析信息。
- Wireshark应该可以解析浏览器发送的https请求,通过应用貌似需要程序特殊配置。
- HttpURLConnection发送GET请求失败,居然因为调用getOutputStream()方法后请求类型变为了POST,哪怕是没有对输出流添加任何数据。
巨人的肩膀
charles高级篇:过滤请求、串改请求、上行下行超时、弱网
使用 RSA 密钥交换方式时,使用私钥解密 HTTPS 流量数据 (timd.cn)
使用 Key Log 解密 TLS 流量 (timd.cn)
使用 MITM 的方式,解密 HTTPS 流量 (timd.cn)
如何通过Wireshark查看HTTPS、HTTP/2网络包(解码TLS、SSL)
抓包工具Charles使用,中间人攻击,手机抓包 - 技术改变命运Andy - 博客园 (cnblogs.com)
清晰图解https如何防范中间人攻击_公钥密码体系防止中间人-CSDN博客
本文来自博客园,作者:疯狂马铃薯,转载请注明原文链接:https://www.cnblogs.com/hr0552/p/18183926
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步