Retrofit之https

Retrofit之https

    好久没有写博客了,之前学习了目前比较火的网络请求框架Retrofit的使用,没有做过的的深入研究,在项目开发过程中,使用还比较顺利。一般的情况下使用retrofit是不用做很多的配置的,最近接触到了https这个网络的协议,使用retrofit做https的请求就不一样了。
    在做请求之前,先要了解下http协议和https协议的基本概念和区别。

1、HTTP和HTTPS的基本概念

   HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器请求和应答的标准(TCP),用于从服务器传输超文本到本地浏览器的传输协议。
   HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议可以建议一种信息安全通道,来保证数据传输的安全,也可以确认一个网站的真实性。

2、HTTP与HTTPS有什么区别?

  HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  HTTPS和HTTP的区别主要如下:

  1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

3、HTTPS工作原理

      (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

  (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

  (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

  (5)Web服务器利用自己的私钥解密出会话密钥。

  (6)Web服务器利用会话密钥加密与客户端之间的通信。


可以看出在浏览器上使用HTTPS协议可以确保信息安全,但是在移动端使用HTTPS协议却多有不便,但是也可以做相应的设置。

Retrofit 是基于okhttp的框架,Retrofit 没有直接设置请求参数的方法,但是却可以先设置okhttpclient ,然后retrofit设置client,这样就可以设置好retrofit做https的请求。
  public static ApiService getDataFromHttps(String baseUrl){

        TrustManager[] trustAll = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
                }
        };
        OkHttpClient client = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null,trustAll,new SecureRandom());
             client = new OkHttpClient.Builder()
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    }).sslSocketFactory(sc.getSocketFactory())
                     .protocols(Collections.singletonList(Protocol.HTTP_1_1))
                     .connectTimeout(10000, TimeUnit.MILLISECONDS)
                    .build();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        Retrofit retrofit = new Retrofit.Builder()
                 .baseUrl(baseUrl)
                 .client(client)
                 .build();

这个方法简单粗暴,自定义TrustManage,不对证书做任何验证,当然如果有证书的话,最好还是做验证处理,初始化一个安全套接字协议对象。
okhttpclient 设置相关的一些验证信息即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值