工作中碰到的那些坑(一)-https网络连接错误

春节长假的最后一天,pm突然微信通知客户端线上版本登录不上去了。


于是赶紧进行如下测试

step1: 在安卓高版本(6.0)上,debug、sim、release环境上客户端工作正常。

step2: 安卓4.4版本,debug、sim环境上客户端工作正常,release环境上所有接口报网络请求出错。

step3: 安卓4.4版本,release环境换成http连接,工作正常。--说明是https连接出现了问题。

step4: 找测试同学询问是否在4.4上测试过客户端的release版本,得到的答复是当时测过没有问题,而且上线后一周都没有问题。

--说明问题是服务器端的证书有变动。


复习一下基本知识点:

1. https原理:   

     浏览器先向服务器取得公钥(证书),然后用公钥加密自己的私钥连同自己私钥加密的请求一并发送给服务器。
     服务器用自己的私钥解密得到浏览器的私钥,使用浏览器的私钥解密请求。然后再用浏览器的私钥加密response发送回服务。

工作中碰到的那些坑(一)-https网络连接错误_第1张图片


2. 如果连接抓包工具(charles),https网络通信过程是怎样的呢?

client发送request,被抓包工具拦截(面对client,抓包工具充当server),把自己的crt发送给client,client验证crt后发送key给抓包工具。

同时抓包工具对于server,充当client,发送request,获得服务器的crt,验证以后发送自己的key给server。

server用抓包工具的key加密response后发送给抓包工具,抓包工具用自己的key解出response,再用client的key加密response发送给client。


在找服务器端、运维的小伙伴核实的过程中,我又对心中的疑问在网上进行了查询

问题一如果是服务器的证书出问题了,为什么安卓版本6.0的工作正常?
The reason this occur is the JVM/Dalvik haven't not confidence in the CA certificates in the system or in the user certificate stores. To fix this with Retrofit, If you are used okhttp, with another client it's very similar. You've to do: A). Create a cert store contain public Key of CA. To do this you need to launch next script for *nix. You need openssl install in your machine, and download from https://www.bouncycastle.org/ the jar bcprov-jdk16-1.46.jar. Download this version not other, the version 1.5x is not compatible with android 4.0.4.
就是android会逐渐添加一些CA的颁发机构到它的信任列表里边来,如果一个CA颁发机构是新的,那么在早期版本的安卓里边可能就不认,但是在新版本里边就可以直接使用了。

 ---从这我们推断出可能的原因是服务器更新了证书,而这个证书的颁发机构在android 5.0以上的版本里边都已经被信任了,但是在4.4以下的版本里边没有被信任。

问题二为什么4.4 release环境,连接charles以后,就工作正常?

---原因同问题一。charles的信任列表里有新证书的颁发机构。


问题的解决:

1. 运维同学先验证了证书没有变动。

2. 运维同学回忆春节前后的工作,想起来release环境的域名在春节期间进行了流量清洗。关掉流量清洗以后问题就解决了。


root cause分析:

如果release环境的域名进行了流量清洗,request访问release域名时会重定向到流量清洗公司的一个网址,这个网址会有一个证书,这个证书不在4.4版本的信任列表里,所以网络连接会出现错误。

对于高版本或者charles,这个证书在信任列表里,网络连接正常,流量清洗公司探测到这不是DDoS攻击,就会把链接重定向回我们公司的域名。


参考资料:

HTTPS 理论基础及其在 Android 中的最佳实践  http://android.jobbole.com/83787/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

你可能感兴趣的:(Android)