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文件和对应文件格式是否正确。
- android https 链接 开发回忆笔记
- Android开发:视频播放横竖屏切换回忆笔记
- Android使用https链接
- Android访问https链接
- Android访问https链接
- 没头没尾之项目开发笔记:回忆
- android笔记之安全开发之使用HTTPS
- Android中HTTPS应用开发--HTTPS介绍
- Android开发okhttp接入https
- Android学习笔记链接
- Android开发系列链接
- Android开发源码链接
- android开发学习链接
- Android JNI开发链接
- 游戏开发笔记的链接
- 前端开发学习笔记 - 链接
- iOS 开发笔记-AFNetWorking https SSL认证
- iOS 开发笔记-AFNetWorking https SSL认证
- JavaScript 参数 arguments深入了解以及javascript内置数据类型的讨论
- 分享一个人发展的一些讨论和思考
- Windows 8.1 正式版微软官方原版镜像下载(新增 MSDN 正式版)
- jdom 解析XML
- CSS3背景渐变属性 linear-gradient(线性渐变)和radial-gradient(径向渐变)。
- android https 链接 开发回忆笔记
- 用中文写程序
- 自画cxGrid表格(类封装)
- PHP、JS对数组的操作
- LEFT JOIN后AND与WHERE的异同
- 选中
- 安装python2.5
- VB.NET中将结构体保存到文件的方法(转)
- C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件