Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 500|回复: 0

[默认分类] https 证书验证 okhttp https设置

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-20 14:00:18 | 显示全部楼层 |阅读模式

    自制https证书
    需要验证.
    okhttp不验证直接通过通过所有的https连接
    代码如下

    1. public void getONetWorkString() {
    2.         OkHttpClient build = new OkHttpClient.Builder()
    3.                 .sslSocketFactory(createSSLSocketFactory())
    4.                                                        .hostnameVerifier(new TrustAllHostnameVerifier())
    5.                                                        .build();
    6.         String        url     = "https://www.12306.cn/mormhweb/";//带https的网址
    7.         final Request request = new Request.Builder().url(url).build();
    8.         Call          call    = build.newCall(request);
    9.         call.enqueue(new Callback() {
    10.             @Override
    11.             public void onFailure(Call call, IOException e) {
    12.                 Log.i("joker", e.getMessage());
    13.             }
    14.             @Override
    15.             public void onResponse(Call call, Response response)
    16.                     throws IOException
    17.             {
    18.                 String res = response.body().string();
    19.                 Log.e("joker",res);
    20.             }
    21.         });
    22.     }
    23.     private static class TrustAllCerts implements X509TrustManager {
    24.         @Override
    25.         public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
    26.         @Override
    27.         public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
    28.         @Override
    29.         public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
    30.     }
    31.     private static class TrustAllHostnameVerifier implements HostnameVerifier {
    32.         @Override
    33.         public boolean verify(String hostname, SSLSession session) {
    34.             return true;
    35.         }
    36.     }
    37.     private static SSLSocketFactory createSSLSocketFactory() {
    38.         SSLSocketFactory ssfFactory = null;
    39.         try {
    40.             SSLContext sc = SSLContext.getInstance("TLS");
    41.             sc.init(null,  new TrustManager[] { new TrustAllCerts() }, new SecureRandom());
    42.             ssfFactory = sc.getSocketFactory();
    43.         } catch (Exception e) {
    44.         }
    45.         return ssfFactory;
    46.     }
    复制代码


    app带证书验证




    1. public void getNetWorkString() {
    2.         String        url     = "https://www.12306.cn/mormhweb/";//带https的网址
    3.         final Request request = new Request.Builder().url(url).build();
    4.         Call          call    = setCard().newCall(request);
    5.         call.enqueue(new Callback() {
    6.             @Override
    7.             public void onFailure(Call call, final IOException e) {
    8.                 runOnUiThread(new Runnable() {
    9.                     @Override
    10.                     public void run() {
    11.                         Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();
    12.                     }
    13.                 });
    14.                 Log.i("joker", e.getMessage());
    15.             }
    16.             @Override
    17.             public void onResponse(Call call, Response response)
    18.                     throws IOException
    19.             {
    20.                 final String res = response.body().string();
    21.                 Log.e("joker",res);
    22.                 runOnUiThread(new Runnable() {
    23.                     @Override
    24.                     public void run() {
    25.                         Toast.makeText(MainActivity.this,res,Toast.LENGTH_LONG).show();
    26.                     }
    27.                 });
    28.             }
    29.         });
    30.     }
    复制代码
    1. public OkHttpClient setCard() {        OkHttpClient.Builder builder = new OkHttpClient.Builder();        try {            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");            KeyStore           keyStore           = KeyStore.getInstance(KeyStore.getDefaultType());            keyStore.load(null);            String certificateAlias = Integer.toString(0);            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(getAssets().open("daodianwang.cer")));//拷贝好的证书            SSLContext sslContext = SSLContext.getInstance("TLS");            final TrustManagerFactory trustManagerFactory =                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());            trustManagerFactory.init(keyStore);            sslContext.init                    (                            null,                            trustManagerFactory.getTrustManagers(),                            new SecureRandom()                    );            builder.sslSocketFactory(sslContext.getSocketFactory());            builder.hostnameVerifier(new HostnameVerifier() {                @Override                public boolean verify(String s, SSLSession sslSession) {                    return true;                }            });        } catch (Exception e) {            e.printStackTrace();        }        return builder.build();    }
    复制代码
    okhttp用的是最新版本3.5的

    用证书这里有个深坑.
    用360浏览器导出的证书可以生效
    然而用UC浏览器导出的证书居然不可以生效.简直不忍直视.坑爆了.代码是可行的.
    asyncHttpClient 用https的配置
    不验证简单到不能再简单了

    1. AsyncHttpClient client = new AsyncHttpClient(true,80,443);
    复制代码
    或者


    1. AsyncHttpClient client = new AsyncHttpClient();
    2. client.setSSLSocketFactory(MySSLSocketFactory.getFixedSocketFactory());
    复制代码













    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 02:38 , Processed in 0.347425 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表