Android之HttpsURLConnection访问网络(android https协议)

来源:互联网 发布:b站视频下载 知乎 编辑:程序博客网 时间:2024/06/05 02:32

Android之HttpsURLConnection访问网络(android https协议)


android 基于https协议(HttpsURLConnection)的网络访问:

由于HttpsURLConnection是HttpURLConnection的子类,在这里就不多作介绍了,
如果需要,可直接把下面的HttpURLConnection改成HttpsURLConnection即可(当前
项目中是http、https都可以访问,所以采用的是HttpURLConnection)
在这里值得注意的是:
1.   本人没用研究过X509HostnameVerifier这个接口,就直接重写了X509HostnameVerifier这个接口,
把它唯一的方法写为空,直接return ture;结果一直抛:CertificationException: Trust anchor
for certification path not found,根据字面意思是指数字签名证书找不到,后来无意中在网上
看到一句这样的代码(当然这安全性低):
X509HostnameVerifier hostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

设置签名证书为所有主机验证通过,然后再设置下面:
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
最后此异常它不抛了。。。。嘿嘿,由此我猜:这个东西可能是指对安全验证的过滤(也可说的安全
级别的设置)

2.   在android中,目前只支持数字签名证书为BKS的格式,如果其它格式的话需要转换,转换就不说了,
网上一大堆。如果有异常为:KeyStore JKSimplementation not found的话一般就是这个原因了。

3.   通过SSLContext.getInstance("TLS")来获取SSL上下文,这个有些不太明白为什么"SSL"和"TLS"有
什么区别,谁知道的话告诉我一下.

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class NetHelper {  
  2.   
  3.     public static final String DOMAIN_LIST = "RestService/User/DomainList";  
  4.   
  5.     X509HostnameVerifier hostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;  
  6.     SSLContext sslContext = null;  
  7.     InputStream in = null;  
  8.   
  9.     public NetHelper() {  
  10.         try {  
  11.             MyX509TrustManager mtm = new MyX509TrustManager();  
  12.             TrustManager[] tms = new TrustManager[] { mtm };  
  13.   
  14.             // 初始化X509TrustManager中的SSLContext  
  15.             sslContext = SSLContext.getInstance("TLS");  
  16.             sslContext.init(null, tms, new java.security.SecureRandom());  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.   
  21.         // 为javax.net.ssl.HttpsURLConnection设置默认的SocketFactory和HostnameVerifier  
  22.         if (sslContext != null) {  
  23.             HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());  
  24.         }  
  25.         HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);  
  26.     }  
  27.   
  28.     /* 
  29.     * 取Domain 
  30.     */  
  31.     public InputStream getDomainList(String path) throws Exception {  
  32.         String uri = path + DOMAIN_LIST;  
  33.         Log.i("sys", uri);  
  34.         URL url = new URL(uri);  
  35.         HttpURLConnection conn = null;//也可用HttpsURLConnection,但将不可进行http访问  
  36.         //if(uri.contains("https")){  
  37.         // conn = (HttpsURLConnection) url.openConnection();  
  38.         //}else  
  39.         conn = (HttpURLConnection) url.openConnection();  
  40.         conn.setRequestMethod("GET");  
  41.         conn.setDoOutput(true);  
  42.         conn.setDoInput(true);  
  43.         // 设置连接超时时间  
  44.         conn.setConnectTimeout(4 * 1000);  
  45.         conn.setRequestProperty("Content-Type""text/xml");  
  46.         conn.connect();  
  47.         in = conn.getInputStream();  
  48.         return in;  
  49.     }  
  50. }  


还需自定义X509TrustManager:
注:通过实现X509TrustManager来定义了证书管理器,对服务器和客户端进行验证方法,
把所有的方法写成空(如果有的话则需要验证),还需要定义我们的KeyStore来源数字
签名证书文件)。然后初始化证书管理工厂,并调用getTrustManagers()方法来获取这个
管理器

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class MyX509TrustManager implements X509TrustManager {  
  2.     X509TrustManager myJSSEX509TrustManager;  
  3.   
  4.     public MyX509TrustManager() throws Exception {  
  5.         KeyStore ks = KeyStore.getInstance("BKS");  
  6.         // ks.load(new FileInputStream("trustedCerts"),  
  7.         // "passphrase".toCharArray()); //----> 这是加载自己的数字签名证书文件和密码,在这里这里没有,所以不需要  
  8.         TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");  
  9.         tmf.init(ks);  
  10.         TrustManager tms[] = tmf.getTrustManagers();  
  11.         for (int i = 0; i < tms.length; i++) {  
  12.             if (tms[i] instanceof X509TrustManager) {  
  13.                 myJSSEX509TrustManager = (X509TrustManager) tms[i];  
  14.                 return;  
  15.             }  
  16.         }  
  17.     }  
  18.   
  19.     @Override  
  20.     public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {  
  21.         // sunJSSEX509TrustManager.checkClientTrusted(arg0, arg1);  
  22.     }  
  23.   
  24.     @Override  
  25.     public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {  
  26.         // sunJSSEX509TrustManager.checkServerTrusted(arg0, arg1);  
  27.     }  
  28.   
  29.     @Override  
  30.     public X509Certificate[] getAcceptedIssuers() {  
  31.         // X509Certificate[] acceptedIssuers = sunJSSEX509TrustManager  
  32.         // .getAcceptedIssuers();  
  33.         // return acceptedIssuers;  
  34.         return null;  
  35.     }  
  36. }  



先记到这里,以后发现错误再改,留给自己以后懂了再来看看改

0 0