2013-04-08 76 views
-1

我在Stackoverflow中發現了很多帖子,但無法獲得解決方案:如何在Android中創建https連接?

如何在Android中創建https連接?

代碼是:

  HttpParams httpParameters = new BasicHttpParams(); 
    ConnManagerParams.setMaxTotalConnections(httpParameters, 25); 
    int timeoutConnection = 10000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, 
      timeoutConnection); 
    int timeoutSocket = 10000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

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

    ClientConnectionManager cm = new ThreadSafeClientConnManager(
      httpParameters, schemeRegistry); 
    httpClient = new DefaultHttpClient(cm, httpParameters); 

任何幫助,將不勝感激。

+0

請發表您的代碼沒有按」解釋獲得響應不要做你需要的東西。 – 2013-04-08 12:19:06

回答

4
HttpClient httpclient = getNewHttpClient(); 

HttpGet httpget = new HttpGet(URL); 
      HttpResponse response = httpclient.execute(httpget); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

public HttpClient getNewHttpClient() { 
     try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 
      trustStore.load(null, null); 

      SSLSocketFactory sf = new MySSLSocketFactory(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); 
     } catch (Exception e) { 
      return new DefaultHttpClient(); 
     } 
    } 

MySSLSocketFactory.java

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

public MySSLSocketFactory(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(); 
} 

} 
+0

當我使用這個解決方案時,它顯示我「javax.net.ssl.SSLPeerUnverifiedException:沒有同行證書」 – 2013-04-08 12:29:19

+0

工作在我的案例 – 2016-08-07 10:26:29