如果不需要验证服务器端证书,直接照这里做

[java] view
plain
copy

  1. public class Demo 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.text);
  9. GetHttps();
  10. }
  11. private void GetHttps(){
  12. String https = " https://800wen.com/";
  13. try{
  14. SSLContext sc = SSLContext.getInstance("TLS");
  15. sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom());
  16. HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  17. HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
  18. HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection();
  19. conn.setDoOutput(true);
  20. conn.setDoInput(true);
  21. conn.connect();
  22. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  23. StringBuffer sb = new StringBuffer();
  24. String line;
  25. while ((line = br.readLine()) != null)
  26. sb.append(line);
  27. text.setText(sb.toString());
  28. }catch(Exception e){
  29. Log.e(this.getClass().getName(), e.getMessage());
  30. }
  31. }
  32. private class MyHostnameVerifier implements HostnameVerifier{
  33. @Override
  34. public boolean verify(String hostname, SSLSession session) {
  35. // TODO Auto-generated method stub
  36. return true;
  37. }
  38. }
  39. private class MyTrustManager implements X509TrustManager{
  40. @Override
  41. public void checkClientTrusted(X509Certificate[] chain, String authType)
  42. throws CertificateException {
  43. // TODO Auto-generated method stub
  44. }
  45. @Override
  46. public void checkServerTrusted(X509Certificate[] chain, String authType)
  47. throws CertificateException {
  48. // TODO Auto-generated method stub
  49. }
  50. @Override
  51. public X509Certificate[] getAcceptedIssuers() {
  52. // TODO Auto-generated method stub
  53. return null;
  54. }
  55. }
  56. }

如果需要验证服务器端证书(这样能够防钓鱼),我是这样做的,还有些问题问大牛:

    a. 导出公钥。在浏览器上用https访问tomcat,查看其证书,并另存为一个文件(存成了X.509格式:xxxx.cer)

    b. 导入公钥。把xxxx.cer放在Android的assets文件夹中,以方便在运行时通过代码读取此证书,留了两个问题给大牛:

[java] view
plain
copy

  1. AssetManager am = context.getAssets();
  2. InputStream ins = am.open("robusoft.cer");
  3. try {
  4. //读取证书
  5. CertificateFactory cerFactory = CertificateFactory.getInstance("X.509");  //问1
  6. Certificate cer = cerFactory.generateCertificate(ins);
  7. //创建一个证书库,并将证书导入证书库
  8. KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");   //问2
  9. keyStore.load(null, null);
  10. keyStore.setCertificateEntry("trust", cer);
  11. return keyStore;
  12. } finally {
  13. ins.close();
  14. }
  15. //把咱的证书库作为信任证书库
  16. SSLSocketFactory socketFactory = new SSLSocketFactory(keystore);
  17. Scheme sch = new Scheme("https", socketFactory, 443);
  18. //完工
  19. HttpClient mHttpClient = new DefaultHttpClient();
  20. mHttpClient.getConnectionManager().getSchemeRegistry().register(sch);

问1:这里用"PKCS12"不行

答1:PKCS12和JKS是keystore的type,不是Certificate的type,所以X.509不能用PKCS12代替

问2:这里用"JKS"不行。

答2:android平台上支持的keystore type好像只有PKCS12,不支持JKS,所以不能用JKS代替在PKCS12,不过在windows平台上是可以代替的

----------------------------------------------分割线-------------------------------------------------------------------------

1。数据通信时加密,不同平台加密后的结果不同,用的库不同吧(进行相应的修改比较麻烦)

2。采用https,系统自动做好了,简单一些

https与http的通信,在我看来主要的区别在于https多了一个安全验证机制,而Android采用的是X509验证,首先我们需要这重写X509类,建立我们的验证规则、、不过对于特定的项目,我们一般都是无条件信任服务端的,因此我们可以对任何证书都无条件信任(其实本质上我们只是信任了特定url的证书,为了偷懒,才那么选择的)/**

 
  1. * 信任所有主机-对于任何证书都不做检查
  2. */
  3. class MytmArray implements X509TrustManager {
  4. public X509Certificate[] getAcceptedIssuers() {
  5. // return null;
  6. return new X509Certificate[] {};
  7. }
  8. @Override
  9. public void checkClientTrusted(X509Certificate[] chain, String authType)
  10. throws CertificateException {
  11. // TODO Auto-generated method stub
  12. }
  13. @Override
  14. public void checkServerTrusted(X509Certificate[] chain, String authType)
  15. throws CertificateException {
  16. // TODO Auto-generated method stub
  17. // System.out.println("cert: " + chain[0].toString() + ", authType: "
  18. // + authType);
  19. }
  20. };
[java] view
plain
copy

  1. * 信任所有主机-对于任何证书都不做检查
  2. */
  3. class MytmArray implements X509TrustManager {
  4. public X509Certificate[] getAcceptedIssuers() {
  5. // return null;
  6. return new X509Certificate[] {};
  7. }
  8. @Override
  9. public void checkClientTrusted(X509Certificate[] chain, String authType)
  10. throws CertificateException {
  11. // TODO Auto-generated method stub
  12. }
  13. @Override
  14. public void checkServerTrusted(X509Certificate[] chain, String authType)
  15. throws CertificateException {
  16. // TODO Auto-generated method stub
  17. // System.out.println("cert: " + chain[0].toString() + ", authType: "
  18. // + authType);
  19. }
  20. };

好了,我们写好了信任规则,接下载就要创建一个主机的信任列表

 
  1. static TrustManager[] xtmArray = new MytmArray[] { new MytmArray() };
  2. /**
  3. * 信任所有主机-对于任何证书都不做检查
  4. */
  5. private static void trustAllHosts() {
  6. // Create a trust manager that does not validate certificate chains
  7. // Android 采用X509的证书信息机制
  8. // Install the all-trusting trust manager
  9. try {
  10. SSLContext sc = SSLContext.getInstance("TLS");
  11. sc.init(null, xtmArray, new java.security.SecureRandom());
  12. HttpsURLConnection
  13. .setDefaultSSLSocketFactory(sc.getSocketFactory());
  14. // HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);//
  15. // 不进行主机名确认
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
  21. @Override
  22. public boolean verify(String hostname, SSLSession session) {
  23. // TODO Auto-generated method stub
  24. // System.out.println("Warning: URL Host: " + hostname + " vs. "
  25. // + session.getPeerHost());
  26. return true;
  27. }
  28. };
[java] view
plain
copy

  1. static TrustManager[] xtmArray = new MytmArray[] { new MytmArray() };
  2. /**
  3. * 信任所有主机-对于任何证书都不做检查
  4. */
  5. private static void trustAllHosts() {
  6. // Create a trust manager that does not validate certificate chains
  7. // Android 采用X509的证书信息机制
  8. // Install the all-trusting trust manager
  9. try {
  10. SSLContext sc = SSLContext.getInstance("TLS");
  11. sc.init(null, xtmArray, new java.security.SecureRandom());
  12. HttpsURLConnection
  13. .setDefaultSSLSocketFactory(sc.getSocketFactory());
  14. // HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);//
  15. // 不进行主机名确认
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
  21. @Override
  22. public boolean verify(String hostname, SSLSession session) {
  23. // TODO Auto-generated method stub
  24. // System.out.println("Warning: URL Host: " + hostname + " vs. "
  25. // + session.getPeerHost());
  26. return true;
  27. }
  28. };

上面的都是https通信需要做的几个基本要求,接下载我们要做的就是https的使用啦下面就以get和post为例进行说明,中间还涉及到cookie的使用

 
  1. String httpUrl="XXXXX"
  2. String result = "";
  3. HttpURLConnection http = null;
  4. URL url;
  5. try {
  6. url = new URL(httpUrl);
  7. // 判断是http请求还是https请求
  8. if (url.getProtocol().toLowerCase().equals("https")) {
  9. trustAllHosts();
  10. http = (HttpsURLConnection) url.openConnection();
  11. ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
  12. } else {
  13. http = (HttpURLConnection) url.openConnection();
  14. }
  15. http.setConnectTimeout(10000);// 设置超时时间
  16. http.setReadTimeout(50000);
  17. http.setRequestMethod("GET");// 设置请求类型为
  18. http.setDoInput(true);
  19. http.setRequestProperty("Content-Type", "text/xml");
  20. //http.getResponseCode());http或https返回状态200还是403
  21. BufferedReader in = null;
  22. if (obj.getHttpStatus() == 200) {
  23. getCookie(http);
  24. in = new BufferedReader(new InputStreamReader(
  25. http.getInputStream()));
  26. } else
  27. in = new BufferedReader(new InputStreamReader(
  28. http.getErrorStream()));
  29. result = in.readLine();
  30. Log.i("result", result);
  31. in.close();
  32. http.disconnect();
[java] view
plain
copy

  1. String httpUrl="XXXXX"
  2. String result = "";
  3. HttpURLConnection http = null;
  4. URL url;
  5. try {
  6. url = new URL(httpUrl);
  7. // 判断是http请求还是https请求
  8. if (url.getProtocol().toLowerCase().equals("https")) {
  9. trustAllHosts();
  10. http = (HttpsURLConnection) url.openConnection();
  11. ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
  12. } else {
  13. http = (HttpURLConnection) url.openConnection();
  14. }
  15. http.setConnectTimeout(10000);// 设置超时时间
  16. http.setReadTimeout(50000);
  17. http.setRequestMethod("GET");// 设置请求类型为
  18. http.setDoInput(true);
  19. http.setRequestProperty("Content-Type", "text/xml");
  20. //http.getResponseCode());http或https返回状态200还是403
  21. BufferedReader in = null;
  22. if (obj.getHttpStatus() == 200) {
  23. getCookie(http);
  24. in = new BufferedReader(new InputStreamReader(
  25. http.getInputStream()));
  26. } else
  27. in = new BufferedReader(new InputStreamReader(
  28. http.getErrorStream()));
  29. result = in.readLine();
  30. Log.i("result", result);
  31. in.close();
  32. http.disconnect();

https或http的get请求写好了,哦中间涉及到了一个getCookie的方法,如下:

 
  1. /** 得到cookie */
  2. private static void getCookie(HttpURLConnection http) {
  3. String cookieVal = null;
  4. String key = null;
  5. DataDefine.mCookieStore = "";
  6. for (int i = 1; (key = http.getHeaderFieldKey(i)) != null; i++) {
  7. if (key.equalsIgnoreCase("set-cookie")) {
  8. cookieVal = http.getHeaderField(i);
  9. cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
  10. DataDefine.mCookieStore = DataDefine.mCookieStore + cookieVal
  11. + ";";
  12. }
  13. }
  14. }
[java] view
plain
copy

  1. /** 得到cookie */
  2. private static void getCookie(HttpURLConnection http) {
  3. String cookieVal = null;
  4. String key = null;
  5. DataDefine.mCookieStore = "";
  6. for (int i = 1; (key = http.getHeaderFieldKey(i)) != null; i++) {
  7. if (key.equalsIgnoreCase("set-cookie")) {
  8. cookieVal = http.getHeaderField(i);
  9. cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
  10. DataDefine.mCookieStore = DataDefine.mCookieStore + cookieVal
  11. + ";";
  12. }
  13. }
  14. }

public static Query HttpQueryReturnClass(String httpUrl, String base64) {

 
  1. String result = "";
  2. Log.i("控制", httpUrl);
  3. Query obj = new Query();
  4. HttpURLConnection http = null;
  5. URL url;
  6. try {
  7. url = new URL(httpUrl);
  8. // 判断是http请求还是https请求
  9. if (url.getProtocol().toLowerCase().equals("https")) {
  10. trustAllHosts();
  11. http = (HttpsURLConnection) url.openConnection();
  12. ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
  13. } else {
  14. http = (HttpURLConnection) url.openConnection();
  15. }
  16. http.setConnectTimeout(10000);// 设置超时时间
  17. http.setReadTimeout(50000);
  18. http.setRequestMethod("POST");// 设置请求类型为post
  19. http.setDoInput(true);
  20. http.setDoOutput(true);
  21. http.setRequestProperty("Content-Type", "text/xml");
  22. http.setRequestProperty("Cookie", DataDefine.mCookieStore);
  23. DataOutputStream out = new DataOutputStream(http.getOutputStream());
  24. out.writeBytes(base64);
  25. out.flush();
  26. out.close();
  27. obj.setHttpStatus(http.getResponseCode());// 设置http返回状态200还是403
  28. BufferedReader in = null;
  29. if (obj.getHttpStatus() == 200) {
  30. getCookie(http);
  31. in = new BufferedReader(new InputStreamReader(
  32. http.getInputStream()));
  33. } else
  34. in = new BufferedReader(new InputStreamReader(
  35. http.getErrorStream()));
  36. result = in.readLine();// 得到返回结果
  37. in.close();
  38. http.disconnect();
  39. } catch (Exception e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }
[java] view
plain
copy

  1. String result = "";
  2. Log.i("控制", httpUrl);
  3. Query obj = new Query();
  4. HttpURLConnection http = null;
  5. URL url;
  6. try {
  7. url = new URL(httpUrl);
  8. // 判断是http请求还是https请求
  9. if (url.getProtocol().toLowerCase().equals("https")) {
  10. trustAllHosts();
  11. http = (HttpsURLConnection) url.openConnection();
  12. ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
  13. } else {
  14. http = (HttpURLConnection) url.openConnection();
  15. }
  16. http.setConnectTimeout(10000);// 设置超时时间
  17. http.setReadTimeout(50000);
  18. http.setRequestMethod("POST");// 设置请求类型为post
  19. http.setDoInput(true);
  20. http.setDoOutput(true);
  21. http.setRequestProperty("Content-Type", "text/xml");
  22. http.setRequestProperty("Cookie", DataDefine.mCookieStore);
  23. DataOutputStream out = new DataOutputStream(http.getOutputStream());
  24. out.writeBytes(base64);
  25. out.flush();
  26. out.close();
  27. obj.setHttpStatus(http.getResponseCode());// 设置http返回状态200还是403
  28. BufferedReader in = null;
  29. if (obj.getHttpStatus() == 200) {
  30. getCookie(http);
  31. in = new BufferedReader(new InputStreamReader(
  32. http.getInputStream()));
  33. } else
  34. in = new BufferedReader(new InputStreamReader(
  35. http.getErrorStream()));
  36. result = in.readLine();// 得到返回结果
  37. in.close();
  38. http.disconnect();
  39. } catch (Exception e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }

这里面的base64是我经过base64加密过以后的数据

android https安全连接的更多相关文章

  1. 用代码实现断开Android手机USB连接【转】

    本文转载自:https://blog.csdn.net/phoebe_2012/article/details/47025309 用代码实现断开Android手机USB连接               ...

  2. [RN] Android 设备adb连接后unauthorized解决方法

    Android 设备adb连接后unauthorized解决方法 安卓设备usb或者adbwireless连接后输入adb device后都是未授权状态 相信很多同学都会遇到这种情况,除了一直重复开关 ...

  3. 如何使用charles对Android Https进行抓包

      Charles.png charles是一款在Mac下常用的截取网络封包工具,对Android Http进行抓包,只要对手机设置代理即可,但对Android Https进行抓包还是破费一些功夫,网 ...

  4. 71.Android之长连接实现

    转载:http://blog.csdn.net/qq_23547831/article/details/51690047 本文中我们将讲解一下App的长连接实现.一般而言长连接已经是App的标配了,推 ...

  5. Android平台上长连接的实现

    Android 平台上长连接的实现 为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰. Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是 ...

  6. [转]Mac OS X 下部分Android手机无法连接adb问题之解决方案

    时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说了,总之做的 ...

  7. 小米2及其他Android手机无法连接mac解决方案

    一般的android连接mac 很方便不用安装驱动就可以啦,可是不知道为什么二般情况下有的android手机(小米2,华为等)就是连接不上,下来就说说二般情况下如何连接. 1.关于本机-->更多 ...

  8. Android Https双向认证 + GRPC

    keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.for ...

  9. Android蓝牙A2DP连接实现

    代码地址如下:http://www.demodashi.com/demo/14624.html 开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果 ...

随机推荐

  1. Java并发框架——什么是AQS框架

    什么是AQS框架 1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也 ...

  2. (一二八)使用POST上传文件

    简介 上传文件到服务器是一个比较常用的操作,最基本的方式是通过POST上传,文件以二进制形式,作为一个参数传递,但是这个POST的结构相当复杂,且必须完全符合HTTP标准. 文件上传的POST格式 该 ...

  3. Dynamics CRM 自定义上传附件的图片悬浮层显示

    CRM中的附件是以流的形式保存在了数据库中,这样做的一个坏处是一旦系统运行时间久,附件上传的多了势必会导致数据库极速扩大,即影响系统的运行效率也对后期的迁移维护带来了不必要的麻烦.所以很多的客户都会要 ...

  4. (一二七)NSURLSession的基本用法 下载与数据获取

    简介 NSURLSession是苹果官方提供的一系列网络接口库,使用他们可以轻松实现下载和数据获取等任务.在上一篇文章中,我们介绍了使用NSURLConnection下载文件和断点续传的功能,实现起来 ...

  5. UI设计--->全心全意为人民服务的宗旨---->注重客户体验--->软件持久的生命力

    UI即User Interface(用户界面)的简称.UI设计是指对软件的人机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适简单.自由,充分体现 ...

  6. SYBASE bcp用法及例子

    BCP是SYBASE公司提供专门用于数据库表一级数据备份的工具. 语法: 语法如下:(可用 bcp – 得到) 常用参数说明: -b batch_size 指定所复制的每批数据中的行数.每个批处理作为 ...

  7. Uva - 1594 - Ducci Sequence

    水题,算出每次的结果,比较是否全0,循环1000次还不是全0则LOOP AC代码: #include <iostream> #include <cstdio> #include ...

  8. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  9. javascript之DOM编程设置节点插入节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 理解WebKit和Chromium: Android 4.4 上的Chromium WebView

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android Web ...