最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android項目中使用HTTPS配置的步驟詳解

 更新時間:2017年06月28日 11:22:04   作者:maimingliang  
這篇文章主要給大家介紹了關(guān)于Android項目中使用HTTPS配置步驟的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。

前言

如果你的項目的網(wǎng)絡(luò)框架是okhttp,那么使用https還是挺簡單的,因為okhttp默認支持HTTPS。傳送門

下面話不多說了,來一起看看詳細的介紹:

Android 使用 HTTPS 配置的步驟。

1、step

配置hostnameVerifier

 new HostnameVerifier() {
   @Override
    public boolean verify(String hostname, SSLSession session) {
     return true;
    }
 };

2.step

配置 sslSocketFactory

public static SSLSocketFactory getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password){
  try{
   TrustManager[] trustManagers = prepareTrustManager(certificates);
   KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
   SSLContext sslContext = SSLContext.getInstance("TLS");
   TrustManager trustManager = null;
   if (trustManagers != null){
    trustManager = new MyTrustManager(chooseTrustManager(trustManagers));
   } else{
    trustManager = new UnSafeTrustManager();
   }
   sslContext.init(keyManagers, new TrustManager[]{trustManager}, new SecureRandom());
   return sslContext.getSocketFactory();
  } catch (NoSuchAlgorithmException e){
   throw new AssertionError(e);
  } catch (KeyManagementException e){
   throw new AssertionError(e);
  } catch (KeyStoreException e){
   throw new AssertionError(e);
  }
 }

 private class UnSafeHostnameVerifier implements HostnameVerifier{
  @Override
  public boolean verify(String hostname, SSLSession session){
   return true;
  }
 }

 private static class UnSafeTrustManager implements 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[]{};
  }
 }

 private static TrustManager[] prepareTrustManager(InputStream... certificates){
  if (certificates == null || certificates.length <= 0) return null;
  try{
   CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
   KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
   keyStore.load(null);
   int index = 0;
   for (InputStream certificate : certificates){
    String certificateAlias = Integer.toString(index++);
    keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
    try{
     if (certificate != null)
      certificate.close();
    } catch (IOException e){
    }
   }
   TrustManagerFactory trustManagerFactory = null;
   trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
   trustManagerFactory.init(keyStore);
   TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
   return trustManagers;
  } catch (NoSuchAlgorithmException e){
   e.printStackTrace();
  } catch (CertificateException e){
   e.printStackTrace();
  } catch (KeyStoreException e){
   e.printStackTrace();
  } catch (Exception e){
   e.printStackTrace();
  }
  return null;

 }

 private static KeyManager[] prepareKeyManager(InputStream bksFile, String password){
  try{
   if (bksFile == null || password == null) return null;
   KeyStore clientKeyStore = KeyStore.getInstance("BKS");
   clientKeyStore.load(bksFile, password.toCharArray());
   KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
   keyManagerFactory.init(clientKeyStore, password.toCharArray());
   return keyManagerFactory.getKeyManagers();
  } catch (KeyStoreException e){
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e){
   e.printStackTrace();
  } catch (UnrecoverableKeyException e){
   e.printStackTrace();
  } catch (CertificateException e){
   e.printStackTrace();
  } catch (IOException e){
   e.printStackTrace();
  } catch (Exception e){
   e.printStackTrace();
  }
  return null;
 }

 private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers){
  for (TrustManager trustManager : trustManagers){
   if (trustManager instanceof X509TrustManager){
    return (X509TrustManager) trustManager;
   }
  }
  return null;
 }

 private static class MyTrustManager implements X509TrustManager{
  private X509TrustManager defaultTrustManager;
  private X509TrustManager localTrustManager;

  public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException{
   TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
   var4.init((KeyStore) null);
   defaultTrustManager = chooseTrustManager(var4.getTrustManagers());
   this.localTrustManager = localTrustManager;
  }

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

  @Override
  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{
   try{
    defaultTrustManager.checkServerTrusted(chain, authType);
   } catch (CertificateException ce){
    localTrustManager.checkServerTrusted(chain, authType);
   }
  }

  @Override
  public X509Certificate[] getAcceptedIssuers(){
   return new X509Certificate[0];
  }
 }

調(diào)用 getSslSocketFactory(null,null,null) 即可。

3.step

設(shè)置OkhttpClient。

方法 getSslSocketFactory(null,null,null) 的第一個參數(shù) 本來要傳入自簽名證書的,當傳入null 即可忽略自簽名證書。

如果你想嘗試不忽略自簽名證書 你可以調(diào)用下面的方法獲取 SSLSocketFactory。并設(shè)置到OkhttpClient中。

 public static SSLSocketFactory getSSlFactory(Context context) {

  try {
   CertificateFactory cf = CertificateFactory.getInstance("X.509");
   InputStream caInput = new BufferedInputStream(context.getAssets().open("client.cer"));//把證書打包在asset文件夾中
   Certificate ca;
   try {
    ca = cf.generateCertificate(caInput);
    LogUtil.d("Longer", "ca=" + ((X509Certificate) ca).getSubjectDN());
    LogUtil.d("Longer", "key=" + ((X509Certificate) ca).getPublicKey());
   } finally {
    caInput.close();
   }

   // Create a KeyStore containing our trusted CAs
   String keyStoreType = KeyStore.getDefaultType();
   KeyStore keyStore = KeyStore.getInstance(keyStoreType);
   keyStore.load(null, null);
   keyStore.setCertificateEntry("ca", ca);

   // Create a TrustManager that trusts the CAs in our KeyStore
   String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
   TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
   tmf.init(keyStore);

   // Create an SSLContext that uses our TrustManager
   SSLContext s = SSLContext.getInstance("TLSv1", "AndroidOpenSSL");
   s.init(null, tmf.getTrustManagers(), null);

   return s.getSocketFactory();
  } catch (CertificateException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  } catch (KeyStoreException e) {
   e.printStackTrace();
  } catch (KeyManagementException e) {
   e.printStackTrace();
  } catch (NoSuchProviderException e) {
   e.printStackTrace();
  }
  return null;
 }

通過上面的幾步配置即可使用https的自簽名證書 和 單向驗證的Https了。

Glide 訪問Https的圖片

1.step

在build.gradle 引入下面的aar

/提供的Module/
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'

2.step

 OkHttpClient okhttpClient = new OkHttpClient.Builder()
    .connectTimeout(30, TimeUnit.SECONDS)
    .retryOnConnectionFailure(true) //設(shè)置出現(xiàn)錯誤進行重新連接。
    .connectTimeout(15, TimeUnit.SECONDS)
    .readTimeout(60 * 1000, TimeUnit.MILLISECONDS)
    .sslSocketFactory(HttpsUtils.getSslSocketFactory(null,null,null))
    .hostnameVerifier(new HostnameVerifier() {
     @Override
     public boolean verify(String hostname, SSLSession session) {
      return true;
     }
    })
     .build();
  //讓Glide能用HTTPS
  Glide.get(this).register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okhttpClient));

設(shè)置已經(jīng)驗證證書的的OkhttpClient 到Glide 既可。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Android 生命周期架構(gòu)組件使用方法

    Android 生命周期架構(gòu)組件使用方法

    這篇文章主要介紹了 Android 生命周期架構(gòu)組件的使用方法,需要的朋友可以參考下
    2018-02-02
  • Android Studio 3.6中使用視圖綁定替代 findViewById的方法

    Android Studio 3.6中使用視圖綁定替代 findViewById的方法

    從 Android Studio 3.6 開始,視圖綁定能夠通過生成綁定對象來替代 findViewById,從而可以幫您簡化代碼、移除 bug,并且從 findViewById 的模版代碼中解脫出來,今天通過本文給大家介紹使用視圖綁定替代 findViewById的方法,感興趣的朋友一起看看吧
    2020-03-03
  • Android ProgressDialog進度條使用詳解

    Android ProgressDialog進度條使用詳解

    這篇文章主要對Android開發(fā)之ProgressDialog讀取文件進度進行解析,感興趣的朋友可以參考一下
    2016-02-02
  • Android自定義View實現(xiàn)波浪動畫

    Android自定義View實現(xiàn)波浪動畫

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)波浪動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Android實現(xiàn)底部導(dǎo)航欄的主界面

    Android實現(xiàn)底部導(dǎo)航欄的主界面

    這篇文章主要為大家詳細介紹了Android實現(xiàn)底部導(dǎo)航欄的主界面 ,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Android實現(xiàn)同頻共幀動畫效果

    Android實現(xiàn)同頻共幀動畫效果

    我們聽過“同頻共振”,其原理是多個物體物體以同樣的頻率振動,但是本篇實現(xiàn)的效果是“同頻共幀”,含義是:動畫以同樣的頻率和同樣的幀展示在多個不同View上,文中通過代碼示例介紹的非常詳細,感興趣的同學(xué)可以自己動手嘗試一下
    2024-01-01
  • android編程判斷應(yīng)用是否具有某個權(quán)限的方法

    android編程判斷應(yīng)用是否具有某個權(quán)限的方法

    這篇文章主要介紹了android編程判斷應(yīng)用是否具有某個權(quán)限的方法,涉及Android進程操作及權(quán)限控制的相關(guān)使用技巧,需要的朋友可以參考下
    2015-10-10
  • Android實現(xiàn)圖片上傳功能

    Android實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)圖片上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • TabLayout實現(xiàn)ViewPager指示器的方法

    TabLayout實現(xiàn)ViewPager指示器的方法

    這篇文章主要為大家詳細介紹了TabLayout實現(xiàn)ViewPager指示器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android自定義控件實現(xiàn)折線圖

    Android自定義控件實現(xiàn)折線圖

    這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)折線圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

新余市| 象州县| 尼勒克县| 怀集县| 柳林县| 东乌珠穆沁旗| 兴城市| 剑河县| 怀柔区| 清原| 颍上县| 南召县| 富民县| 张家川| 高邑县| 长治市| 缙云县| 乌拉特中旗| 和平县| 邵阳市| 南昌县| 米泉市| 神农架林区| 板桥市| 乐业县| 万年县| 如皋市| 北流市| 信阳市| 禹城市| 古丈县| 铜山县| 南投市| 沙河市| 永兴县| 自贡市| 上犹县| 堆龙德庆县| 岑溪市| 阆中市| 西林县|