Android https ssl证书配置(使用okhttp)

本文介绍使用okhttp时配置https证书的用法,关于证书的原理和SSL协议本文不做介绍,需要的同学自行查阅。https证书常见的错误用法是信任所有证书,https证书在移动应用中常见的问题是证书过期但客户端无法及时更新的问题。本文列举了几种配置方法,并做简单总结:

1、验证系统中信任的根证书(默认)

  • 不适合自颁发的证书(12306.cn)
  • 一般不会存在中间人劫持问题,原因如下:

    • Android 内置的 SSL 的实现是引入了Conscrypt 项目,而 HTTP(S)层则是使用的2.x的 OkHttp。而 SSL 层只负责校验证书的真假,对于所有基于SSL 的应用层协议,需要自己来校验证书实体的身份,因此 Android 默认的域名校验则由 OkHostnameVerifier 实现的,默认是校验域名的。如果使用其他网络库则需要check一下是否校验的域名。

    • WebView的默认校验证书规则也会校验域名,检查到如果网站部署的SSL证书不是浏览器受信任的根证书颁发机构,则会有安全警告。

    • 受信任的根证书颁发机构,在别人申请证书时会校验 域名所有权验证。

2、验证本地证书(certificate pinning),cer 和 pem 格式都可以

  • 本地证书打包在App内,无法及时更新,无法应对证书过期或吊销问题。
  • 如果是自颁发的证书,期限尽可能设置长点,如果是信任机构颁发的证书,则需要在过期前提前放置新证书,实现平滑过渡。
client = OkHttpClientUtil.getSSLClient(client,this,"12306.cer");

3、不验证任何证书

  • 存在中间人劫持问题
client = OkHttpClientUtil.getTrustAllSSLClient(client);

总结

  • 1、使用自颁发的长期限的本地证书(方法2)最安全省事。
  • 2、推荐使用我封装的RetrofitPlus,里边包含了本文的配置,还有更方便的retrofit用法:https://github.com/MasonLiuChn/RetrofitPlus
  • 3、本文代码:https://github.com/MasonLiuChn/TestOkhttpSSL

你可能感兴趣的:(Android)