oKHttp 3.0忽略/检查https证书

最近公司项目需要,网络协议支持HTTPS,之前接触不多,所以这次想总结一下https在Android开发中的相关内容

一、HTTPS 证书

对于HTTPS和证书的概念,大家可以自行搜索百度。

证书分两种:

1、花钱向认证机构购买的证书。服务器如果使用了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接用https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作

2、另一种是自己制作的证书,使用此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书

二、如何忽略证书

注意,下面的操作在线上环境强烈不建议采纳,只能是在测试环境中解决测试问题的时候才能使用。

1、服务器如果加上了证书的话,那么你们的网络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话而什么也不做的话,客户端将直接报错,如图:

意思就是没有找到本地证书,那就开始构建一个SSL来信任所有的证书,忽略证书其实就是如此。

2、新建一个类

通过这个类我们可以获得SSLSocketFactory,这个东西就是用来管理证书和信任证书的。

 

但是有一点需要注意:

然后我们在okhttp中设置SSLSocketFactory,如图:

运行之后,发现还是会报错,如图:

意思是我们的请求证书和服务器的证书不一致,这是因为我们还需要配置一个HostnameVerifier来忽略host验证

三、在SSLSocketClient的类中再加入一个方法:

然后再okhttp中配置一下 HostnameVerifier:


在运行,可以正常访问了。

四、整体配置

copy整个工具类到你的项目中:

然后再okhttp中配置

如果你用的是retrofit,在retrofit中配置一下okhttp即可

这样你就可以忽略https证书正常访问你的网络了。

注意,上述的操作在线上环境强烈不建议采纳,只能是在测试环境中解决测试问题的时候才能使用。

如果我们不需要忽略HTTPS证书,而是在HTTPS证书的验证过程中增加检查项,则参考如下代码:

如果我们需要防范HTTPS中间人攻击,在应用内部携带一个根证书,在系统证书的验证完成后,增加一个根证书的校验过程,则参考如下代码:

但是,实际上,上述代码都不够完美,都会被Android Studio在编译的时候警告:

那么更加合规的做法是怎么操作呢?

其实,需要在 TrustManager 中执行的操作,完全可以在 HostnameVerifier 中更加方便的实现。

不妨参考如下的代码:

参考链接


发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注