-1

我在 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);

任何帮助,将不胜感激。

4

2 回答 2

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

}
于 2013-04-08T12:25:27.257 回答
0

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

  1. 使用 Bouncy Castle 使用 OpenSSL 工具创建证书。

  2. 将证书加载到代码中并教您的代码使用它。

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

在此链接http://www.compiletimeerror.com/2013/01/login-application-for-android-android.html#.VSE1ftyUfTB中解释了一个很好的示例,它逐步定义了它是如何工作的

于 2015-04-05T14:35:24.660 回答