2014-07-06 74 views
2

我正在開發一個應用程序。定位爲Android 4.4(API級別19),並且在我的HTTP交換期間,我希望在HTTPS連接的情況下接受所有證書。這是一個明確的選擇,因爲我的應用程序就像掃描儀一樣。Android 4.4 - HttpClient - TLS - 接受所有證書

,我已經找到了所有的例子,用事實類「org.apache.http.conn.ssl.SSLSocketFactory」擁有一個構造器接受SSL上下文和主機名驗證。

問題是API級別19中「SSLSocketFactory」類的實現不再具有此構造函數版本,而且我找不到向類「SSLSocketFactory」提供自定義TrustManager的方法。

Android API級別19中的HttpClient仍然可以實現我的目標嗎?

回答

4

信託SSL廠:

public class TrustSSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 

    public TrustSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

     TrustManager tm = new X509TrustManager() { 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     }; 

     sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
    } 
} 

與用法:

KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 
      trustStore.load(null, null); 
     SSLSocketFactory sf = new TrustSSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(
       params, registry); 

     return new DefaultHttpClient(ccm, params); 

(這是我目前使用的代碼需要注意的是其非常不安全所以只能在發展使用。)

我不記得我從哪裏得到這個代碼,所以我不能信任原作者。

+0

你好艾蘭,它的工作原理,非常感謝你:) – righettod

+0

很高興幫助:) – Eran

+0

工作過的HttpClient 4.2.1 – site