问题场景
调用某功能云端接口请求,保存如下信息:Web服务通信期间握手期间远程主机关闭连接
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
分析
由于同一份代码不同机器有的能调用成功,有的调用失败的前提下,网上给的解决方案无法解决(比如,配置环境等)。
采用tcpdump抓包继续分析问题:
- 机器需要有root权限(adb root/su)
- 下载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中断抓包进程
- 使用Wireshark等工具查看抓包文件
Wireshark For Mac (64-bit) 1.11.2下载地址:http://www.onlinedown.net/softdown/109518_2.htm - 用wireshark打开capture.pcap即可分析log
- 根据调用的api查询ip:ping xxx.com(域名)
结论
通过正常调用和握手失败的两个网络包对比分析,截图如下:
请求服务端时使用的加密有差异,第二种加密方式无法正常握手成功,检查加密相关代码,发现未根据是否使用GM加密方式做判断导致的问题。至此,问题解决。