欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

如果你的項目的網絡框架是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];
  }
 }

調用 getSslSocketFactory(null,null,null) 即可。

3.step

設置OkhttpClient。

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

如果你想嘗試不忽略自簽名證書 你可以調用下面的方法獲取 SSLSocketFactory。并設置到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) //設置出現錯誤進行重新連接。
    .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));

設置已經驗證證書的的OkhttpClient 到Glide 既可。

總結

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

相關文章

  • 淺談Android 照相機權限的聲明

    淺談Android 照相機權限的聲明

    今天小編就為大家分享一篇淺談Android 照相機權限的聲明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Android開發(fā)手冊Button按鈕實現點擊音效

    Android開發(fā)手冊Button按鈕實現點擊音效

    這篇文章主要為大家介紹了Android開發(fā)手冊Button按鈕實現點擊音效示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 在android中使用緩存和脫機存儲

    在android中使用緩存和脫機存儲

    這篇文章主要介紹了在android中使用緩存和脫機存儲,緩存可以加速你的應用程序,即使在網絡不可用時,用戶能夠更加流暢地使用你的應用程序使用緩存是相當簡單的,需要一個單一的代碼行,下面來看看文章的詳細內容
    2021-11-11
  • dagger2使用方法教程之簡明講解

    dagger2使用方法教程之簡明講解

     Dagger2 是一個Android依賴注入框架,由谷歌開發(fā),最早的版本Dagger1 由Square公司開發(fā)。下面這篇文章主要給大家介紹了關于dagger2的一些使用方法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-04-04
  • 詳解Android 通過Socket 和服務器通訊(附demo)

    詳解Android 通過Socket 和服務器通訊(附demo)

    Android 通過Socket 和服務器通訊,是一種比較常用的通訊方式,這篇文章主要介紹了詳解Android 通過Socket 和服務器通訊,有興趣的可以了解一下。
    2016-12-12
  • Android自定義View圓形百分比控件(一)

    Android自定義View圓形百分比控件(一)

    這篇文章主要為大家詳細介紹了Android自定義View圓形百分比控件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android 實現加載大圖片的方法

    Android 實現加載大圖片的方法

    對于超大的圖片,如果不縮放的話,容易導致內存溢出。而經過處理后,無論多大的圖片,都能夠在手機屏幕上加載出來,不會導致內存溢出。本文將對Android 加載大圖片的實現方法進行介紹,下面跟著小編一起來看下吧
    2017-04-04
  • Android ListView position詳解及實例代碼

    Android ListView position詳解及實例代碼

    這篇文章主要介紹了Android ListView position的相關資料,在開發(fā)Android 應用的時候你真的用對了嗎?這里給大家徹底解釋下,需要的朋友可以參考下
    2016-10-10
  • Android性能優(yōu)化之弱網優(yōu)化詳解

    Android性能優(yōu)化之弱網優(yōu)化詳解

    這篇文章主要為大家介紹了Android性能優(yōu)化之弱網優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 關于Android Studio封裝SDK的那些事兒

    關于Android Studio封裝SDK的那些事兒

    這篇文章主要給大家介紹了關于Android Studio封裝SDK的那些事兒,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-09-09

最新評論