如何在Android中创建https连接?

时间:2013-04-08 12:17:48

标签: android https

我在Stackoverflow中发现了很多帖子但无法使解决方案适用于:

如何在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);

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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();
}

}

答案 1 :(得分:0)

当您与服务器进行https通信时,您需要做几件事。

  1. 使用Bouncy Castle使用OpenSSL工具创建一个cretificate。

  2. 将cretificate加载到代码中并教你的代码使用它。

  3. 最后点击URL以使用HttpResponse类
  4. 获取响应

    这个链接http://www.compiletimeerror.com/2013/01/login-application-for-android-android.html#.VSE1ftyUfTB

    解释了一个很好的例子,它通过分步指南定义了它的工作原理。