• HTTPS双向认证


    生成证书

    openssl genrsa -des3 -out server.key 2048
    openssl req -new -x509 -key server.key -out ca.crt -days 3650
    openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt

    1.继承SSLSocketFactory

    /**
     * Author:JsonLu
     * DateTime:2016/5/31 19:46
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class SecureSSLSocketFactory extends SSLSocketFactory {
    
        private final SSLContext sslContext = SSLContext.getInstance("TLS");
    
        public SecureSSLSocketFactory(KeyStore keystore, String keystorePassword, KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
            super(keystore, keystorePassword, truststore);
            try {
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                keyManagerFactory.init(keystore, keystorePassword.toCharArray());
                KeyManager[] km = keyManagerFactory.getKeyManagers();
                TrustManager[] tm = null;
                if (truststore == null) {
                    tm = new TrustManager[] { new X509TrustManager() {
                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[] {};
                        }
                        @Override
                        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                        }
    
                        @Override
                        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                        }
                    } };
                } else {
                    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    trustManagerFactory.init(truststore);
                    tm = trustManagerFactory.getTrustManagers();
                }
                sslContext.init(km, tm, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        @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();
        }
    }

    2.

    /**
     * Author:JsonLu
     * DateTime:2016/5/31 20:02
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class SecureHttpsClient extends DefaultHttpClient {
    
        private static KeyStore keyStore,trustStore;
        private static String keyStorePwd;
        private Context ctx;
        private final String KEYSTORE_FILE = "client.p12";
        private final String TRUESTSTORE_FILE = "server.p12";
        private final String KEYSTORE_PWD = "a123456789";
        private final String TRUESTSORE_PWD = "a123456";
    
        public SecureHttpsClient(Context context){
            ctx = context;
            init(KEYSTORE_FILE,KEYSTORE_PWD,TRUESTSTORE_FILE,TRUESTSORE_PWD);
        }
    
        public void init(KeyStore keyStore,KeyStore trustStore,String keyStorePwd){
            this.keyStore = keyStore;
            this.trustStore = trustStore;
            this.keyStorePwd = keyStorePwd;
        }
    
        public void init(String keyStoreFile,String keyStorePwd,String trustStoreFile,String truestStorePwd){
            this.keyStore = getKeyStoreByP12(keyStoreFile,keyStorePwd);
            this.trustStore = getKeyStoreByP12(trustStoreFile,truestStorePwd);
            this.keyStorePwd = keyStorePwd;
        }
    
        @Override
        protected ClientConnectionManager createClientConnectionManager() {
            try {
                SecureSSLSocketFactory sf = new SecureSSLSocketFactory(keyStore, keyStorePwd, 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 ccm;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public KeyStore getKeyStoreByP12(String p12File, String p12Pwd) {
            InputStream p12In = null;
            try {
                p12In = ctx.getResources().getAssets().open(p12File);
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                keyStore.load(p12In, p12Pwd.toCharArray());
                return keyStore;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    if (p12In != null) {
                        p12In.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
    }
    

    3.

    /**
     * Author:JsonLu
     * DateTime:2016/5/31 20:28
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class CallServer {
    
        private final String HTTPS_URL = "https://192.168.8.116:8443/";
    
        private DefaultHttpClient getSumpayHttpsClient(Context context) {
            SecureHttpsClient client = new SecureHttpsClient(context);
            client.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT,60);
            client.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,60);
            return client;
        }
    
        public String goHttpsPost(String method,HashMap<String, String> reqParmas, Context context) {
            String result = null;
            HttpPost post = new HttpPost(HTTPS_URL + method);
            HttpResponse response;
            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                Set<String> paramsKeySet = reqParmas.keySet();
                Iterator<String> ite = paramsKeySet.iterator();
                while (ite.hasNext()) {
                    String key = ite.next();
                    nameValuePairs.add(new BasicNameValuePair(key, reqParmas
                            .get(key)));
                }
                post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
                DefaultHttpClient httpClient = getSumpayHttpsClient(context);
                response = httpClient.execute(post);
                if (response.getStatusLine().getStatusCode() != 404) {
                    result = EntityUtils.toString(response.getEntity(), "utf-8");
                } else {
    
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            } finally {
                post.abort();
            }
            Log.d("https请求返回数据",result);
            return result;
        }
    }
    

    4.

    /**
     * Author:JsonLu
     * DateTime:2016/5/31 20:33
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class DemoHttps extends Activity{
    
        private CallServer callServer = new CallServer();
        private TextView tv_content;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_content = (TextView) findViewById(R.id.content);
        }
    
        public void onClick(View v){
            new Thread(){
                @Override
                public void run() {
                    HashMap hashMap = new HashMap<String,String>();
                    hashMap.put("data","data");
                    String res = callServer.goHttpsPost("https", hashMap, getBaseContext());
                    Message msg = new Message();
                    msg.obj = res;
                    handler.sendMessage(msg);
                }
            }.start();
        }
    
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                tv_content.setText((String) msg.obj);
            }
        };
    }
    

      

  • 相关阅读:
    SQL Server复制情况下的高可用方案(一)镜像+复制
    sqlserver数据库镜像运行模式
    普通PC机支持内存128G,单条32G内存
    ICSharpCode.SharpZipLib 压缩、解压文件 附源码
    利用SharpZipLib进行字符串的压缩和解压缩
    SQL Server常见数据类型介绍
    .net中压缩和解压缩的处理
    solr字段压缩属性compressed新版本已经移除
    solr schema.xml Field属性详解
    Altmetric
  • 原文地址:https://www.cnblogs.com/Jsonlu/p/5547540.html
Copyright © 2020-2023  润新知