Android网络编程——https 不验证证书方式(信任所有证书)

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

      直接给出代码:

     

[java]  view plain copy print ?
  1. public class HttpsTestActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     private TextView text;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         text=(TextView)findViewById(R.id.textView1);  
  9.         GetHttps();  
  10.     }  
  11.       
  12.     private void GetHttps(){  
  13.         String https = "https://www.google.com.hk";  
  14.         try{  
  15.             SSLContext sc = SSLContext.getInstance("TLS");  
  16.             sc.init(nullnew TrustManager[]{new MyTrustManager()}, new SecureRandom());  
  17.             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  
  18.             HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());  
  19.             HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection();  
  20.             conn.setDoOutput(true);  
  21.             conn.setDoInput(true);  
  22.             conn.connect();  
  23.             BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));   
  24.             StringBuffer sb = new StringBuffer();   
  25.             String line;   
  26.             while ((line = br.readLine()) != null)   
  27.                 sb.append(line);                  
  28.             text.setText(sb.toString());  
  29.            }catch(Exception e){  
  30.                 Log.e(this.getClass().getName(), e.getMessage());  
  31.            }        
  32.      }  
  33.   
  34.   
  35.   
  36.       private class MyHostnameVerifier implements HostnameVerifier{  
  37.             @Override  
  38.             public boolean verify(String hostname, SSLSession session) {  
  39.                     // TODO Auto-generated method stub  
  40.                     return true;  
  41.             }  
  42.   
  43.        }  
  44.   
  45.        private class MyTrustManager implements X509TrustManager{  
  46.             @Override  
  47.             public void checkClientTrusted(X509Certificate[] chain, String authType)  
  48.                             throws CertificateException {  
  49.                     // TODO Auto-generated method stub    
  50.             }  
  51.             @Override  
  52.             public void checkServerTrusted(X509Certificate[] chain, String authType)  
  53.   
  54.                             throws CertificateException {  
  55.                     // TODO Auto-generated method stub      
  56.             }  
  57.             @Override  
  58.             public X509Certificate[] getAcceptedIssuers() {  
  59.                     // TODO Auto-generated method stub  
  60.                     return null;  
  61.             }          
  62.   
  63.       }     
  64. }  

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

原文地址:http://blog.csdn.net/xyz_lmn/article/details/8027334 

你可能感兴趣的:(Android网络编程——https 不验证证书方式(信任所有证书))