2014-02-25 71 views
11

我開發出使用凌空 android應用。 所有通信都通過HTTPS連接完成。 因爲我在本地環境中測試它,所以我使用Tomcat的自簽名證書。如何導入自簽名的SSL證書凌空於Android 4.1+

之前,我只有android 2.33.0設備。現在我也有4.1和4.4

我的實現使用了這種方法:http://developer.android.com/training/articles/security-ssl.html(部分未知的證書頒發機構) 在與Android 設備高達4.1它完美的作品。帶有定製證書的SSLSocketFactory傳遞給Volley:

Volley.newRequestQueue(getApplicationContext(), new HurlStack(null, socketFactory)); 

但是Android 4.1+會發生什麼? 爲什麼它不起作用? 我也試圖與NullX509TrustManager這樣的:

private static class NullX509TrustManager implements X509TrustManager { 
    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) 
      throws CertificateException { 
    } 

    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) 
      throws CertificateException { 
    } 

    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 
} 

但它仍然無法正常工作......

回答

3

與解決方案在這裏提到的我已經解決它:

http://developer.android.com/training/articles/security-ssl.html

驗證主機名

常見問題

通過添加自定義主機名驗證這對於我在排球項目的主機名和編輯HurlStack的openConnection方法返回true:

if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) {    
    ((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory); 
    ((HttpsURLConnection)connection).setHostnameVerifier(new CustomHostnameVerifier());   
} 
+0

我不明白 –

0

,我發現最簡單的方法是adding this classonCreate方法執行它

new NukeSSLCerts().nuke(); 

它將抽射信任所有SSL證書

+1

準確地說,「它會抽籤信任所有SSL證書」,請記住它對生產環境不安全。 –

+0

生產環境(生產)過於危險... – ivanleoncz

+1

什麼是生產環境? –

0

信任所有SSL證書: - 你可以,如果你繞過SSL想要在測試服務器上進行測試。 但不要使用此代碼進行生產。

public static class NukeSSLCerts { 
protected static final String TAG = "NukeSSLCerts"; 

public static void nuke() { 
    try { 
     TrustManager[] trustAllCerts = new TrustManager[] { 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        X509Certificate[] myTrustedAnchors = new X509Certificate[0]; 
        return myTrustedAnchors; 
       } 

       @Override 
       public void checkClientTrusted(X509Certificate[] certs, String authType) {} 

       @Override 
       public void checkServerTrusted(X509Certificate[] certs, String authType) {} 
      } 
     }; 

     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 
     }); 
    } catch (Exception e) { 
    } 
} 

}

請撥打本的onCreate()函數功能活動或在您的應用程序類。

NukeSSLCerts.nuke(); 

這可以用於Android中的Volley。 更多參考。 https://newfivefour.com/android-trust-all-ssl-certificates.html