android https 链接 开发回忆笔记

来源:互联网 发布:淘宝买家一天几个好评 编辑:程序博客网 时间:2024/06/05 17:24

下午百般无聊,写在今年年初弄的HTTPS请求链接。

安卓Https链接有两种,一种不需要验证证书,一种是需要验证证书的(带在程序本地),这个比较麻烦。

后者实现思路是这样:首先,需要拿到服务器生成的BKS的keystore文件,为什么是BKS呢?因为安卓只用这个格式的证书,如果您在使用Https开发访问服务器时,就需要向服务器开发人员要个BKS的keystore文件,和该文件的密码。不清楚如何转换的请看这:http://blog.csdn.net/wishes222/article/details/16965143 。

然后拿到了Keystore文件后把他放到项目res-raw下,发起https连接之前将服务器证书加到httpclient的信任证书列表中,初始化传输层SSL的安全协议TLS(TLS与SSL在传输层对网络连接进行加密。)。对应代码片段1

最后,是HTTPS链接,PS:Https与Http类似,只不过Https一般是通过post请求服务器,但是Https与http不同的是Https与服务器会话是处于连接状态。http则发送请求后连接就会断开。对应代码片段2

 代码片段1

/** * X509 BKS 证书Maneger *   *  * @author  suhl * @version  [版本号, 2013-3-13] * @see  [相关类/方法] * @since  [产品/模块版本] */public class MyX509TrustManager implements X509TrustManager {X509TrustManager myJSSEX509TrustManager; public MyX509TrustManager() throws Exception {     KeyStore ks = KeyStore.getInstance("BKS");     // 这是加载自己的数字签名证书文件和密码,    ks.load(        OAApplication.getInstance().getResources().openRawResource(                        R.raw.tomcat_trust), "12345678".toCharArray());    TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");    tmf.init(ks);    TrustManager tms[] = tmf.getTrustManagers();    for (int i = 0; i < tms.length; i++) {    if (tms[i] instanceof X509TrustManager) {    myJSSEX509TrustManager = (X509TrustManager) tms[i];    return;}}}  @Overridepublic X509Certificate[] getAcceptedIssuers() {// X509Certificate[] acceptedIssuers = sunJSSEX509TrustManager// .getAcceptedIssuers();// return acceptedIssuers;return null;}@Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {// TODO Auto-generated method stub}@Overridepublic void checkServerTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {// TODO Auto-generated method stub}}
代码片段2

   /**      * https的post方式请求链接     *       * @param path     *             请求的路径     * @param params     *           参数值     * @author suhl     */    public static String requestHttps(String path, Map<String, String> params)        throws Exception        {            X509HostnameVerifier hostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;            SSLContext sslContext = null;            InputStream inputStream = null;                        try {                // 初始化证书                MyX509TrustManager mtm = new MyX509TrustManager();                TrustManager[] tms = new TrustManager[] { mtm };                                // 初始化X509TrustManager中的SSLContext  suhl                sslContext = SSLContext.getInstance("TLS");                sslContext.init(null, tms, new java.security.SecureRandom());                } catch (Exception e) {                e.printStackTrace();                }                                // 为javax.net.ssl.HttpsURLConnection设置默认的SocketFactory和HostnameVerifier  suhl                if (sslContext != null) {                HttpsURLConnection.setDefaultSSLSocketFactory(sslContext                .getSocketFactory());                }                HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);                         // https 链接的初始化和地址拼接,基本和http方法一致。 suhl                            StringBuilder sb = new StringBuilder();            StringBuilder result = new StringBuilder();            OutputStream os = null;            HttpsURLConnection conn = null;//也可用HttpsURLConnection,但将不可进行http访问            try               {            if (path.indexOf("?") > 0)                path += "&noNeedSiteMesh=true";            else                path += "?noNeedSiteMesh=true";                        Log.i("request", "path:" + path);                      if (params != null && params.size() != 0)           {               for (Map.Entry<String, String> entry : params.entrySet())               {                   if (null != entry.getValue())                   {                       sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));                       sb.append("&");                   }               }               sb.deleteCharAt(sb.length() - 1);           }                             String uri = path ;        // entity为请求体部分内容//如果有中文则以UTF-8编码为username=%E4%B8%AD%E5%9B%BD&password=123       byte[] entity = sb.toString().getBytes();       URL url = new URL(uri);              //if(uri.contains("https")){       // conn = (HttpsURLConnection) url.openConnection();       //}else       conn = (HttpsURLConnection) url.openConnection();    // conn.setRequestMethod("GET");    // conn.setDoOutput(true);    // conn.setDoInput(true);    // // 设置连接超时时间    // conn.setConnectTimeout(4 * 1000);    // conn.setRequestProperty("Content-Type", "text/xml");        // 设置请求超时的时间       conn.setConnectTimeout(5000);       // 以POST方式发送请求体       conn.setRequestMethod("POST");       // 要向外输出数据,要设置这个       conn.setDoOutput(true);       conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");       conn.setRequestProperty("Content-Length", entity.length + "");    // conn.connect();       os = conn.getOutputStream();       os.write(entity);              inputStream = conn.getInputStream();               if (conn.getResponseCode() == 200)        {// 表明请求数据成功            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));            String temp = null;            while ((temp = reader.readLine()) != null)            {                result.append(temp);            }        }                Log.i("su", "result++++" + result);                os.close();        inputStream.close();        // 最后关闭连接        conn.disconnect();        int tep = result.indexOf("{\"");        Log.i("su", "result++++" + result);        os.close();        inputStream.close();        // 最后关闭连接        conn.disconnect();                 if (tep > 0)            return result.substring(tep).toString();        else            return result.toString();    }    catch (Exception ex)    {       System.out.println("请求路径:" + path + "\n发送内容:" + sb.toString() + "\n返回结果:" + result.toString() + "\n异常信息:"            + (ex != null ? ex.getMessage() : "") + "\n"   );        //upLoadErrorLog();//上传文件        throw ex;    }    finally    {        if(null != os)        {            os.close();        }                if(null != inputStream)        {            inputStream.close();        }                if(null != conn)        {         // 最后关闭连接            conn.disconnect();        }    }               }

上面代码都是我项目中的源码。如果开发者在开发过程中发现了安全验证错误,则考虑是否初始化添加成功keystore文件和对应文件格式是否正确。


原创粉丝点击