Android网络握手失败问题分析

223 阅读1分钟

问题场景

调用某功能云端接口请求,保存如下信息:Web服务通信期间握手期间远程主机关闭连接

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

分析

由于同一份代码不同机器有的能调用成功,有的调用失败的前提下,网上给的解决方案无法解决(比如,配置环境等)。

采用tcpdump抓包继续分析问题:

  1. 机器需要有root权限(adb root/su)
  2. 下载tcpdump( 获取地址
#本地推送到android端
adb push ~/Downloads/tcpdump  /data/local/tcpdump
#修改tcpdump权限
chmod 777 /data/local/tcpdump
#进入root权限
su
#运行命令启动抓包
/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap
#在android端执行相应需要进行抓包分析的操作,
#执行完成后在命令提示符窗口执行Ctrl+C中断抓包进程
  1. 使用Wireshark等工具查看抓包文件 Wireshark For Mac (64-bit) 1.11.2下载地址: www.onlinedown.net/softdown/10…
  2. 用wireshark打开capture.pcap即可分析log
  3. 根据调用的api查询ip:ping xxx.com(域名)

结论

通过正常调用和握手失败的两个网络包对比分析,截图如下:

请求服务端时使用的加密有差异,第二种加密方式无法正常握手成功,检查加密相关代码,发现未根据是否使用GM加密方式做判断导致的问题。至此,问题解决。