https 证书验证 okhttp https设置

自制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.  
  15.             @Override
  16.             public void onResponse(Call call, Response response)
  17.                     throws IOException
  18.             {
  19.                 String res = response.body().string();
  20.                 Log.e("joker",res);
  21.             }
  22.         });
  23.     }
  24.  
  25.     private static class TrustAllCerts implements X509TrustManager {
  26.         @Override
  27.         public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  28.  
  29.         @Override
  30.         public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  31.  
  32.         @Override
  33.         public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
  34.     }
  35.     private static class TrustAllHostnameVerifier implements HostnameVerifier {
  36.         @Override
  37.         public boolean verify(String hostname, SSLSession session) {
  38.             return true;
  39.         }
  40.     }
  41.     private static SSLSocketFactory createSSLSocketFactory() {
  42.         SSLSocketFactory ssfFactory = null;
  43.  
  44.         try {
  45.             SSLContext sc = SSLContext.getInstance("TLS");
  46.             sc.init(null,  new TrustManager[] { new TrustAllCerts() }, new SecureRandom());
  47.  
  48.             ssfFactory = sc.getSocketFactory();
  49.         } catch (Exception e) {
  50.         }
  51.  
  52.         return ssfFactory;
  53.     }

复制代码



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.  
  17.             @Override
  18.             public void onResponse(Call call, Response response)
  19.                     throws IOException
  20.             {
  21.                 final String res = response.body().string();
  22.                 Log.e("joker",res);
  23.                 runOnUiThread(new Runnable() {
  24.                     @Override
  25.                     public void run() {
  26.                         Toast.makeText(MainActivity.this,res,Toast.LENGTH_LONG).show();
  27.                     }
  28.                 });
  29.             }
  30.         });
  31.     }

复制代码

  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());

复制代码




 

猜你喜欢

转载自my.oschina.net/u/3798489/blog/1647798