android HTTPS 訪問 安全認證

在訪問HTTPS時需要安裝認證在默認情況下,設置所有都可以

創建一個HttpClient 這個設置認證那些

1

private static HttpClient client = HttpClientHelper.getHttpClient();


public static String HTTPPostJson(String url, JSONObject params) {
//      HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        String responseStr = null;
        try {
            StringEntity entity = new StringEntity(params.toString(),HTTP.UTF_8);
            entity.setContentType("application/json");
            post.setEntity(entity);
            HttpResponse response = client.execute(post);
            if (HttpURLConnection.HTTP_OK != response.getStatusLine()
                    .getStatusCode()) {
                Log.e("post result code", ""+response.getStatusLine()
                    .getStatusCode());
                return null;
            }
            HttpEntity entity2 = response.getEntity();
            responseStr = EntityUtils.toString(entity2);   
                                                                    
        } catch (Exception e) {
            e.printStackTrace();
        }
        return responseStr;
    }

HttpClientHelper.java

package com.weima.smarthome.utils;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import android.content.res.AssetManager;
public class HttpClientHelper {
    private static HttpClient httpClient;
     private static final String CLIENT_KEY_KEYSTORE = "BKS"; //"JKS";//密庫,這裏用的是BouncyCastle密庫    
     private static final String CLIENT_TRUST_KEYSTORE = "BKS"; //"JKS";//  
        private static final String CLIENT_KET_PASSWORD = "***"; //私鑰密碼      
    private HttpClientHelper() {
    }
    public static synchronized HttpClient getHttpClient() {
        if (null == httpClient) {
            // 初始化工
            try {
                    
//                  讀取證書
//              KeyStore kks = KeyStore.getInstance(KeyStore.getDefaultType());//BKS or JKS android只支持bks格式的密庫,
//              kks.load(context.getAssets().open("cacerts.bks"), CLIENT_KET_PASSWORD.toCharArray());
                KeyStore kks = KeyStore.getInstance(KeyStore
                        .getDefaultType());
                //添加認證
                kks.load(null, null);
                SSLSocketFactory sf = new SSLSocketFactoryEx(kks);
                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  //允許?主機的驗?
                HttpParams params = new BasicHttpParams();
                HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
                HttpProtocolParams.setContentCharset(params,
                        HTTP.UTF_8);
                HttpProtocolParams.setUseExpectContinue(params, true);
                // 設置連接管理器的超時
                ConnManagerParams.setTimeout(params, 10000);
                // 設置連接超時
                HttpConnectionParams.setConnectionTimeout(params, 10000);
                // 設置socket超時
                HttpConnectionParams.setSoTimeout(params, 10000);
                // 設置http https支持
                SchemeRegistry schReg = new SchemeRegistry();
                schReg.register(new Scheme("http", PlainSocketFactory
                        .getSocketFactory(), 55555));
                schReg.register(new Scheme("https", (SocketFactory) sf, 55556));
                ClientConnectionManager conManager = new ThreadSafeClientConnManager(
                        params, schReg);
                httpClient = new DefaultHttpClient(conManager, params);
            } catch (Exception e) {
                e.printStackTrace();
                return new DefaultHttpClient();
            }
        }
        return httpClient;
    }
}
class SSLSocketFactoryEx extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");
    public SSLSocketFactoryEx(KeyStore truststore)
            throws NoSuchAlgorithmException, KeyManagementException,
            KeyStoreException, UnrecoverableKeyException {
        super(truststore);
        TrustManager tm = new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] chain, String authType)
                    throws java.security.cert.CertificateException {
            }
            @Override
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] chain, String authType)
                    throws java.security.cert.CertificateException {
            }
        };
        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();
    }
      
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章