• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

    為您解碼網站建設的點點滴滴

    Volley支持Https及自簽名證書

    發表日期:2016-11 文章編輯:小燈 瀏覽次數:2358

    1.https是什么?

    簡單講,https 是在http的基礎上增加了SSL/TLS協議
    詳細參見HTTPS傳輸加密原理

    2.Android支持的證書類型有哪些?

    1)受信證書(由安卓認可的證書頒發機構, 或這些機構的下屬機構頒發的證書)詳細參見受信任的證書頒發機構
    2)不受信證書(沒有得到安卓認可的證書頒發機構頒發的證書)
    3)自簽名證書(自己頒發的證書, 分臨時性的(在開發階段使用)或在發布的產品中永久性使用的兩種)

    3.為什么使用自簽名證書?

    1)免費( 購買受信任機構頒發的證書每年要交 100 到 500 美元不等的費用. 自簽名證書不花一分錢)
    2)普及率高(自簽名證書在手機應用中的普及率較高 ,跟用電腦瀏覽網頁不同, 手機的應用一般就固定連一臺服務器)
    3)方便(在開發階段寫的代碼,測試跟發布的時候也可以用)

    4.Volley如何支持https?

    1)受信證書,不需要修改代碼,直接使用,就像SSL/TLS協議透明
    2)不受信證書和自簽名證書,需要修改Volley庫代碼(Volley底層支持,但是沒有暴露出來方法)

    5.如何修改Volley庫代碼?

    1)clone volley庫
    a.從Google Repositoryclone
    b.從清華鏡像clone
    2)代碼修改

    volley_https_ssl.png
    3)SSLSocketHelper.java

    import android.content.Context; import android.util.Log;import java.io.IOException; import java.io.InputStream; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class SSLSocketHelper { private static TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) { final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0]; return new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return originalTrustManager.getAcceptedIssuers(); }public void checkClientTrusted(X509Certificate[] certs, String authType) { try { if (certs != null && certs.length > 0){ certs[0].checkValidity(); } else { originalTrustManager.checkClientTrusted(certs, authType); } } catch (CertificateException e) { Log.w("checkClientTrusted", e.toString()); } }public void checkServerTrusted(X509Certificate[] certs, String authType) { try { if (certs != null && certs.length > 0){ certs[0].checkValidity(); } else { originalTrustManager.checkServerTrusted(certs, authType); } } catch (CertificateException e) { Log.w("checkServerTrusted", e.toString()); } } } }; }public static SSLSocketFactory getSSLSocketFactoryByCertificate(Context context,String keyStoreType, int keystoreResId) throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = context.getResources().openRawResource(keystoreResId);Certificate ca = cf.generateCertificate(caInput); caInput.close();if (keyStoreType == null || keyStoreType.length() == 0) { keyStoreType = KeyStore.getDefaultType(); } KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca);String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore);TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, wrappedTrustManagers, null);return sslContext.getSocketFactory(); }public static SSLSocketFactory getSSLSocketFactoryByKeyStore(Context context,String keyStoreType, int keystoreResId, String keyPassword) throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {InputStream caInput = context.getResources().openRawResource(keystoreResId);// creating a KeyStore containing trusted CAsif (keyStoreType == null || keyStoreType.length() == 0) { keyStoreType = KeyStore.getDefaultType(); } KeyStore keyStore = KeyStore.getInstance(keyStoreType);keyStore.load(caInput, keyPassword.toCharArray());// creating a TrustManager that trusts the CAs in the KeyStoreString tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore);TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, wrappedTrustManagers, null);return sslContext.getSocketFactory(); } } 

    4)詳細可參看GitHub工程
    GitHub工程與原始的volley對比:
    a.增加了cache包,com.android.volley.ssl包,com.android.volley.utils包
    b.在com.android.volley.toolbox包中,新增ByteRequest.java,GsonRequest.java,JsonArrayPostRequest.java,JsonObjectPostRequest.java,修改了Volley.java
    c.只有com.android.volley.ssl包和Volley.java與支持https自簽名證書有關系

    6.如何自簽名證書?

    一般是運維搞,可參考如下鏈接:
    使用 OpenSSL 生成自簽名證書
    基于OpenSSL自建CA和頒發SSL證書
    使用openssl生成自簽名證書以及nginx ssl雙向驗證
    創建并部署自簽名的 SSL 證書到 Nginx

    7.本工程在CFCA證書中驗證通過,也可直接使用jar包:httpsVolley/build/intermediates/bundles/release/classes.jar

    8.信任所有證書,實現簡單,但有風險,不能在產品中使用。可參考【第六篇】Volley之https相關

    9.WebView 支持https

    import android.webkit.WebView; import android.webkit.WebViewClient; import android.webkit.SslErrorHandler; import android.net.http.SslError;private WebView webView;webView = (WebView) findViewById(R.id.my_webview); webView.setWebViewClient(new WebViewClient() {@Override public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } }); 

    10.參考鏈接

    國內鏡像加速Android源碼下載
    通過 HTTPS 和 SSL 確保安全
    Certificate authority
    清華大學開源軟件鏡像站
    Does the Web View on Android support SSL?
    Android _實現SSL解決不受信任的證書問題
    Using Android Volley With Self-Signed SSL Certificate
    Android volley self signed HTTPS trust anchor for certification path not found
    Android 網絡--我是怎么做的: Volley+OkHttp+Https
    Making a HTTPS request using Android Volley

    11.后記

    1)上層使用(HttpService.java 修改)

    Paste_Image.png

    2)最上層使用(BaseActivity.java修改)

    Paste_Image.png
    本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.juherenli.com/20479.html
    相關開發語言
     八年  行業經驗

    多一份參考,總有益處

    聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

    咨詢相關問題或預約面談,可以通過以下方式與我們聯系

    業務熱線:余經理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    • QQ咨詢
    • 在線咨詢
    • 官方微信
    • 聯系電話
      座機0755-29185426
      手機13699882642
    • 預約上門
    • 返回頂部
    九九九精品视频免费| 91麻豆国产精品91久久久| 国产精品伦子一区二区三区| 无码人妻精品中文字幕免费 | 国产精品亚洲二区在线| 无码人妻精品一区二区| 国产精品伦理久久久久久| 欧美国产成人精品二区芒果视频| 国产精品三级在线观看无码| 一区二区不卡久久精品| 精品国产乱码久久久久久郑州公司| 亚洲AV无码成人精品区天堂| 亚洲精品国产高清不卡在线| 亚洲精品无码不卡在线播放| 人妻熟妇乱又伦精品视频| 三上悠亚精品一区二区久久 | 国产精品自产拍在线网站| 久热中文字幕在线精品免费| 久久精品乱子伦免费| 国产亚洲色婷婷久久99精品91| 国产精品亚洲专一区二区三区| 国产精品臀控福利在线观看| 骚片AV蜜桃精品一区| 国产区精品一区二区不卡中文 | 国产乱人伦偷精品视频免下载| 精品在线免费视频| 精品久久久久久无码人妻| 精品爆乳一区二区三区无码av| 久久夜色精品国产嚕嚕亚洲av| 国内精品伊人久久久久网站| 福利姬在线精品观看 | 精品亚洲成α人无码成α在线观看| 国产精品久久现线拍久青草| 久久婷婷五月综合色精品| 国产成人精品免费视| 久久精品国产日本波多野结衣| 99精品在线免费观看| 亚洲精品综合一二三区在线| 久久精品人人槡人妻人人玩| 精品久久久久久久久中文字幕| 2022国产成人精品视频人|