Android-OKhttp解决https安全链接请求问题

Android-OKhttp解决https安全链接请求问题

关于特别理论的东西大家可以百度下自己去了解下,这里就简单说一下,HTTPS相当于HTTP的安全版本了,为什么安全呢?

因为它在HTTP的之下加入了SSL (Secure Socket Layer),安全的基础就靠这个SSL了。SSL位于TCP/IP和HTTP协议之间,那么它到底能干嘛呢?

它能够:

认证用户和服务器,确保数据发送到正确的客户机和服务器;(验证证书)
加密数据以防止数据中途被窃取;(加密)
维护数据的完整性,确保数据在传输过程中不被改变。(摘要算法)

    1. HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程的简单描述如下:

    2. 浏览器将自己支持的一套加密算法、HASH算法发送给网站。
      网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

    3. 浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站。

    4. 网站接收浏览器发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用浏览器发来的数字串使加密一段握手消息发给浏览器。

    5. 浏览器解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
      握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。

android端加载https链接有两种信任的方案,一种是通过信任所有的网站,此外还有一种方式就是通过校验的方式

1. 关于OKHttp的Https的认证问题(全部信任)

亲测很管用,步骤如下:

  • 1,新TrustAllcert类实现X509TrustManager接口:

    public class TrustAllCerts implements X509TrustManager {  
        @Override    
        public void checkClientTrusted(X509Certificate[] chain, String authType) {}  
    
        @Override    
        public void checkServerTrusted(X509Certificate[] chain, String authType) {}  
    
        @Override    
        public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}    
    }    
    
  • 2,方法createSSLSocketFactory()调用类TrustAllcert,获取SSLSocketFactory:

    private static SSLSocketFactory createSSLSocketFactory() {  
        SSLSocketFactory ssfFactory = null;  
    
        try {  
            SSLContext sc = SSLContext.getInstance("TLS");  
            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());  
    
            ssfFactory = sc.getSocketFactory();  
        } catch (Exception e) {  
        }  
    
        return ssfFactory;  
    }  
    
  • 3,初始化OKHttpClient配置:

    OkHttpClient.Builder builder = new OkHttpClient.Builder();  
           builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);  
           builder.sslSocketFactory(createSSLSocketFactory());  
           builder.hostnameVerifier(new HostnameVerifier() {  
               @Override  
               public boolean verify(String hostname, SSLSession session) {  
                   return true;  
               }  
           });  
    

好了,搞定了。此方法是okHttp信任所有的https。

2.匹配证书添加安全信任规则

2.1这里就有一个很重要的概念了,https是分为单向认证,双向认证的

  • 有兴趣的同学可以深入的研究这篇文章 Https单向认证和双向认证

2.1.1 单向认证

  • 在建立Socket连接之前,需要进行握手,具体过程如下:
    Android-OKhttp解决https安全链接请求问题_第1张图片

  • 1.客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。

  • 2.服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
  • 3.客户端使用服务端返回的信息验证服务器的合法性,包括:

    • 1.证书是否过期
    • 2.发型服务器证书的CA是否可靠
    • 3.返回的公钥是否能正确解开返回证书中的数字签名
    • 4.服务器证书上的域名是否和服务器的实际域名相匹配
    • 5.验证通过后,将继续进行通信,否则,终止通信
  • 4.客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择

  • 5.服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
  • 6.服务器将选择好的加密方案通过明文方式返回给客户端
  • 7.客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
  • 9.服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。
  • 10.在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。

2.2、双向认证

双向认证和单向认证原理基本差不多,只是除了客户端需要认证服务端以外,增加了服务端对客户端的认证,具体过程如下:

Android-OKhttp解决https安全链接请求问题_第2张图片

  • 1.客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
  • 2.服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
  • 3.客户端使用服务端返回的信息验证服务器的合法性,包括:

    • 1.证书是否过期
    • 2.发型服务器证书的CA是否可靠
    • 3.返回的公钥是否能正确解开返回证书中的数字签名
    • 4.服务器证书上的域名是否和服务器的实际域名相匹配
    • 5.验证通过后,将继续进行通信,否则,终止通信
  • 4.服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端

  • 5.验证客户端的证书,通过验证后,会获得客户端的公钥
  • 6.客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
    服务器端在客户端提供的加密方案中选择加密程度最高的加密方式
  • 7.将加密方案通过使用之前获取到的公钥进行加密,返回给客户端
  • 8.客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端
  • 9.服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。

你可能感兴趣的:(网络请求)