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

Android項(xiàng)目中使用HTTPS配置的步驟詳解

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

前言

如果你的項(xiàng)目的網(wǎng)絡(luò)框架是okhttp,那么使用https還是挺簡單的,因?yàn)閛khttp默認(rèn)支持HTTPS。傳送門

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

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) 的第一個(gè)參數(shù) 本來要傳入自簽名證書的,當(dāng)傳入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的自簽名證書 和 單向驗(yàn)證的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)錯(cuò)誤進(jì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)驗(yàn)證證書的的OkhttpClient 到Glide 既可。

總結(jié)

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

相關(guān)文章

  • 淺談Android 照相機(jī)權(quán)限的聲明

    淺談Android 照相機(jī)權(quán)限的聲明

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

    Android開發(fā)手冊Button按鈕實(shí)現(xiàn)點(diǎn)擊音效

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

    在android中使用緩存和脫機(jī)存儲(chǔ)

    這篇文章主要介紹了在android中使用緩存和脫機(jī)存儲(chǔ),緩存可以加速你的應(yīng)用程序,即使在網(wǎng)絡(luò)不可用時(shí),用戶能夠更加流暢地使用你的應(yīng)用程序使用緩存是相當(dāng)簡單的,需要一個(gè)單一的代碼行,下面來看看文章的詳細(xì)內(nèi)容
    2021-11-11
  • dagger2使用方法教程之簡明講解

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

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

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

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

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

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

    Android 實(shí)現(xiàn)加載大圖片的方法

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

    Android ListView position詳解及實(shí)例代碼

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

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

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

    關(guān)于Android Studio封裝SDK的那些事兒

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

最新評論