gradle load library SSLHandshakeException

起因:

以前项目中引用的library都是在gitub上,但是公司觉得不安全,运维要求将github上所有跟公司library都删除。

迁移方案:

将github中的library迁移到内网搭建的gitlab上。

遇到的问题:

android studio中 gradle加载内网gitlab的library始终加载异常,最后通过./gradlew build —-stacktrace 得知是SSLHandshakeException。

解决过程:

1.先去github上看了gradle的源代码:发现gradle中的http是引用apache/httpcomponents-client。然后去httpcomponents-client找到发生SSLHandshakeException时因为session == null。

2。要解决SSLHandshakeException肯定得对https得有个初步的认识,首先了解了一下https是如何传输的?然后去看了看数字签名、数字证书、SSL、https是什么关系?

3.有个大概的基础知识之后,去google搜了一通,最终得出以下solution :
1.trust all
2.turn off check
3.import certificate

4.最终采用import certificate方案,具体操作如下
1.先通过浏览器将certificate下载到本地。
2.然后去查看一下在AndroidStudio中找到项 配置的JDK 径(File>Other Settings->DefaultProject Stucture…), 将certificate copy到jdk/Contents/Home/jre/lib/security下。
3.在security目录下执行:keytool -import -alias 别名 -file <导入的证书名.cer> -keystore cacerts -storepass changeit
ps:证书添加成功后,尝试拉取代码。拉取失败,可尝试重启AndroidStudio或者 重启Mac。

以上方案虽然解决了问题,但是在团队协作中很不方便,需要每位用户都主动导入证书,并且对于证书过期也比较麻烦,为了更近一步解决问题,需要一个更优的解决方案….

在解决以上问题的过程中,一直有俩个一直困扰我的问题:
1.为什么gradle加载github的地址就没有问题,而唯独加载gitlab不行,可是github和gitlab都是https的请求?
2.为什么通过浏览器的方式可以下载到gitlab上的library,而gradle却不行?

第一个问题,让我怀疑gitlab的服务器配置的证书有问题,可是第二个问题却反向证明了gitlab配置的证书没问题,这俩个问题怎么着都想不通?????为了更近一步解决这个问题:
1.我将github的证书跟github的证书内容进行了仔细的对比:
gtihub CA:
顶级:DigiCert High Assurance EV Root CA
中间:DigiCert SHA2 Extended Validation Server CA
自己:github.com
gitlab CA:
顶级:DigiCert Global Root CA
中间:DigiCert SHA2 Secure Server CA
自己:xxx.xxx.cn
我先去系统中查看DigiCert High Assurance EV Root CA和DigiCert Global Root CA都有,
而DigiCert SHA2 Extended Validation Server CA和DigiCert SHA2 Secure Server CA都没有,
我又去jdk中查看,和系统中的情况一模一样,也就是说:不管是系统还是jdk环境下都只持有(信任)github和gitlab的顶级证书,通过顶级证书来信任中间证书,近而信任自己签发的证书。那么:不管是github和gitlab都应该返回一个证书链。通过顶级链接到中间证书,最后链接到自己签发的证书。到这个时候我就怀疑是gitlab返回的证书链有问题,那为什么浏览器可以访问到呢,可能是因为浏览器缓存了中间证书,也就是说浏览器以前在别的网站中访问过这个证书链。
于是去找运维的同学聊了一下,让他帮忙查看了后台配合的证书链,果然后台只配置了中间证书,并没有将顶级证书和中间证书链接起来,至此问题终于圆满解决了,但是需要运维的同学帮忙去解决。