2013-04-08 106 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