Android使用自定义证书的HTTPS通信

什么是自签名证书

Android已经把将近150个CA根证书(数字证书认证机构认证过的证书)内置在手机中,这150多个证书被全世界信赖,自签名证书代指没有通过受信任的证书颁发机构(非android默认信任的证书机构也归为此类)。

SSL证书分类

  1. 由android认可的证书颁发机构或者该结构下属的机构颁发的证书,比如Symantec,Go Daddy等机构,约150多个。更多的自行在手机”设置->安全->信任的凭据”中查看

  2. 没有被android所认可的证书所颁发的证书

  3. 自己颁发的证书

这三类证书中,只有第一种在使用中不会出现安全提示,不会抛出异常。 由于我们使用的是自签名的证书,因此客户端不信任服务器,会抛出异常:javax.net.ssl.SSLHandshakeException:.为此,我们需要自定义信任处理器(TrustManager)来替代系统默认的信任处理器,这样我们才能正常的使用自定义的正说或者非android认可的证书颁发机构颁发的证书。

解决方案(Retrofit)

客户端不内置证书

由于我们使用的是自签名的证书,所以需要自定义TrustManager,很多处理策略非常简单粗暴:让客户端不对服务器证书做任何验证,这样做相当于直接忽略了检验服务端证书。因此无论服务器的证书如何,都能建立起https链接。

虽然能建立HTTPS连接,但是无形之中间人攻击打开了一道门。有心人完全可以拦截到我们的HTTPS请求,然后用伪造的证书冒充真正服务端的数字证书,由于客户端不对证书做验证(也就没法判断服务端到底是正常的还是伪造的),这样客户端就会和黑客的服务器建立连接。

客户端内置证书

在retrofit中使用自签名证书大致要经过以下几步:

  • 将证书添加到工程中
  • 自定义信任管理器TrustManager
  • 用自定义TrustManager代替系统默认的信任管理器

使用非android认证证书颁发机构颁发的证书的关键在于:修改android中SSLContext自带的TrustManager以便能让我们的签名通过验证