Retrofit+OkHttp中如何正确的使用https?

本文上半部分转自16年9月份的文章,主要补充原理,后半部分补充当前2022年retrofit的最新用法,如果你已经对原理了如指掌亦或是在别的博客看到了类似的内容,请直接跳转到最新内容阅读。

原理部分内容转载自:Retrofit中如何正确的使用https? - 移动开发其他类 - 红黑联盟

很多文章对客户端https的使用都是很模糊的,不但如此,有些开发者直接从网上拷贝一些使用https的“漏洞”代码,无形之中让客户端处在一种高风险的情况下。

今天我们就对有关https使用的问题进行深入的探讨,希望能解决以往的困惑。对于https,需要了解其工作原理的可以参考https是如何工作的?,更多关于https的问题我会站在客户端的角度在后面陆陆续续的写出来。


证书锁定

简介

首先来说说什么是证书锁定。

证书锁定是用来限制哪些证书和证书颁发机构是可信任的。需要我们直接在代码中固定写死使用某个服务器的证书,然后用自定义的信任存储去代替系统系统自带的,再去连接我们的服务器,我们将这种做法称之为证书锁定。换言之,证书锁定就是在代码中验证当前服务器是否持有某张指定的证书,如果不是则强行断开链接。

有同学问证书锁定有什么好处么?最大的好处使用证书锁定提高安全性,降低了成本。为什么这么说呢?如果你想破解该通信,需要首先拿到客户端,然后对其反编译,修改后再重新打包签名,相比原先的做法,这无疑是增加了破解难度。除了之外,由于证书锁定可以使用自签名的证书,那就意味着我们不需要再向android认可的证书颁发机构购买证书了,这样就可以剩下每年1000多块钱的证书费用,能省一点就省一点嘛。

retrofit中使用证书锁定

现在,我们来看看如何在retrofit中进行证书锁定。

OkHttpClient client = new OkHttpClient.Builder()
    .certificatePinner(new CertificatePinner.Builder()
            .add("sbbic.com", "sha1/C8xoaOSEzPC6BgGmxAt/EAcsajw=")
            .add("closedevice.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
            .build())

通过上面的代码不难看出,retrofit中的证书锁定同样是借助OkHttpClient实现的:通过为OkHttpClient添加CertificatePinner即可。CertificatePinner对象以构建器的方式创建,可以通过其add()方法来锁定多个证书。

证书锁定的原理

现在我们深入下证书锁定的原理。我们知道,无论http还是https,都是服务端被动,客户端主动。那么问题来了,客户端第一次发出请求之后,无法确定服务端是不是合法的。那么很可能就会出现以下情景:

正常情况下是这样,我们想要根据文章aid查看某篇文章内容,其流程如下:

此时,如果黑客恶意拦截这个通信过程,会是怎么样?

此时恶意服务端完全可以发起双向攻击:对上可以欺骗服务端,对下可以欺骗客户端,更严重的是客户端段和服务端完全感知不到已经被攻击了。这就是所谓的中间人攻击。

中间人攻击(MITM攻击)是指,黑客拦截并篡改网络中的通信数据。又分为被动MITM和主动MITM,被动MITM只窃取通信数据而不修改,而主动MITM不当能窃取数据,还会篡改通信数据。最常见的中间人攻击常常发生了公共wifi或者公共路由上,有兴趣的私下可以问我,这里不做演示了。

现在可以看看证书锁定是怎么样提高安全性,避免中间人攻击的,用一张简单的流程图来说明:

不难看出,通过证书锁定能有有效的避免中间人攻击。

证书锁定的缺点

证书锁定尽管带了较高的安全性,但是这种安全性的提高却牺牲了灵活性。一旦当证书发生变化时,我们的客户端也必须随之升级,除此之外,我们的服务端不得不为了兼容以前的客户端而做出一些妥协或者说直接停用以前的客户端,这对开发者和用户来说并不是那么的友好。

但实际上,极少情况下我们才会变动证书。因此,如果产品安全性要求比较高还是启动证书锁定吧。


使用android认可的证书颁发机构颁发的证书

有些同学可能好奇自己公司中使用https,但是在客户端代码中并没有书写绑定证书的代码?以访问github的代码为例:

public vo
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值