android-okhttp解决链接请求问题

移动开发 waitig 838℃ 百度已收录 0评论

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。


本文由【waitig】发表在等英博客
本文固定链接:android-okhttp解决链接请求问题
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)