Android https通信问题

来源:互联网 发布:江苏省大数据管理中心 编辑:程序博客网 时间:2024/05/18 16:57

1、信任所有的证书:

    Android平台上经常有使用https的需求,对于https服务器使用的根证书是受信任的证书的话,实现https是非常简单的,直接用httpclient库就行了,与使用http几乎没有区别。但是在大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败。解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复杂一些,很容易出错;另一种办法是让httpclient信任所有的服务器证书,这种办法相对来说简单很多,但安全性则差一些,但在某些场合下有一定的应用场景。这一篇主要实现httpclient信任所有的服务器证书。

      直接给出代码:


package com.example.zq.test3;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import cn.edu.zafu.bmobdemo.R;/** * Created by stevenzhang on 2017/2/21 0021. */public class HttpsTestActivity extends Activity {        /** Called when the activity is first created. */        private TextView text;    public static final String TAG = "HttpsTestActivity";            @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        text=(TextView)findViewById(R.id.textView1);        GetHttps();    }    private void GetHttps(){        final String https = "https://www.google.com.hk";//google可能访问不了,可以换一个https链接                new Thread(new Runnable() {            @Override            public void run() {                try{                    SSLContext sc = SSLContext.getInstance("TLS");                    sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom());                    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());                    HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());                    HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection();                    conn.setDoOutput(true);                    conn.setDoInput(true);                    conn.connect();                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));                    final StringBuffer sb = new StringBuffer();                    String line;                    while ((line = br.readLine()) != null)                        sb.append(line);                                        runOnUiThread(new Runnable() {                        @Override                        public void run() {                            text.setText(sb.toString());                        }                    });                                 }catch(Exception e){                    Log.e(TAG, e.toString());                }            }        }).start();        //        runOnUiThread(new Runnable() {//            @Override//            public void run() {//             //            }//        });                                              }    private class MyHostnameVerifier implements HostnameVerifier {        @Override        public boolean verify(String hostname, SSLSession session) {            // TODO Auto-generated method stub              return true;        }    }    private class MyTrustManager implements X509TrustManager {        @Override        public void checkClientTrusted(X509Certificate[] chain, String authType)                throws CertificateException {            // TODO Auto-generated method stub            }        @Override        public void checkServerTrusted(X509Certificate[] chain, String authType)                throws CertificateException {            // TODO Auto-generated method stub              }        @Override        public X509Certificate[] getAcceptedIssuers() {            // TODO Auto-generated method stub              return null;        }    }}  

使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。


0 0
原创粉丝点击