Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求


详细的https介绍及处理,大家可以去看这篇文章http://www.cnblogs.com/alisecurity/p/5939336.html

本篇又是简单的功能实现,对原理不分析。既然我们要对https请求做处理,那么我们把url修改一下:
private String GET_URL_HTTPS= "https://kyfw.12306.cn/otn/leftTicket/init"; run(GET_URL_HTTPS);//Https请求

因为12306使用的是自签名证书,如果使用浏览器则会出现下图提示,如果使用okhttp则提示(java.security.cert.CertPathValidatorException: Trust anchor for certification path not found), 这个时候浏览器可以选择继续访问或者安装证书,继续访问默认的是让浏览器无条件信任该证书,下载证书则是客户端验证证书的过程。而okhttp则需要我们手动去实现,本篇文章实现的是okhttp本地添加证书校验的过程,无条件信任证书不讲解。

Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求_第1张图片
访问拒绝
  • 1 首先将证书导出到本地,我使用的chrome浏览器,其他请自己查询办法,点击图二的小锁按钮,然后再点击详细信息会弹出图三,点击view certificate按钮跳到图四,然后复制到文件选择base64编码格式即可将文件导出到本地,我命名为12306.cer,将它copy到assert目录下
Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求_第2张图片
图二
Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求_第3张图片
图三
Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求_第4张图片
图四
Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求_第5张图片
图五
  • 2 okhttp添加证书,我们在初始化okhttpclient的之前把证书添加上去,代码如下
//通过  OkHttpClient.Builder来创建OkHttpClient,正常我们使用时也应该这样创建,这样我们可以在builder中添加超时时间,日志打印,添加header等等!
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
            addCertificate(getAssets().open("12306.cer"), builder);
//添加证书
 public void addCertificate(InputStream certificate, OkHttpClient.Builder builder) {
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");//设置证书格式
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            keyStore.setCertificateEntry("12306", certificateFactory.generateCertificate(certificate));
            final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            client = builder.sslSocketFactory(sslContext.getSocketFactory()).build();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

好了这个时候你再去请求,就能正常返回结果了。
代码已经上传:https://github.com/MrAllRight/HttpExample

你可能感兴趣的:(Rxjava2+Retrofit2结合mvp的简单教程OkHttp篇(二):OkHttp3的https请求)