今年年初就已经吵吵着要把大部分的服务端由http转成https了,但是由于很多公司还是比较懒,而且有的公司可能不想再多掏一些钱去对自己的网址加入CA认证,所以这件事就一直拖下来了,但是随着用户数据越来越多暴露在一些不法分子眼前,所以信息安全越来越被用户重视,一些金融、贷款公司已经开始使用这种技术了,今天就来讲解一下android上面的通过https对服务器进行请求。

首先先来解答一下疑惑,我们在做测试的时候经常会对https://www.baidu.com或者https://www.github.com进行一个网络工具类的测试,但是不知道大家有没有注意到,这些网址链接之前全都是https://的,为什么我们在访问的时候完全没有报错,也能够正常的访问呢。ok,其实这两个大网站已经被CA认证过了,而CA证书已经被android设备默认支持了,所以这些CA认证的网站可以直接通过HttpUrlConnection进行连接,当然也可以通过HttpsUrlConnection进行连接。

但是除了被CA认证的网址就不能够正常的连接了,比如我们访问神奇的网站12306时,在他的注册页面其实已经升级成了Https协议的了,而且这个网站的证书是没有被CA认证过的。我们来分别对比下百度的 和github 还有我们神奇的网站12306的 签名文件~~~

见图:

第一张是百度网站的 证书文件信息

这张是github的证书信息

这张当然就是12306的喽

大家可以自己打开电脑浏览器,打开开发者工具(或者F12),然后点击security就能看到这个信息了,如果对证书感兴趣,还可以点击上边的“view certificate”去查看证书的信息

我们通过上面的三个图,不难分析出baidu 和github使用的是CA的认证的证书,而12306并没有,12306用的是自己证书

这就导致了12306需要我们特别去写一下网络请求,而百度和github则不需要。

那我们怎么去正常的访问12306呢,这里我封装了一个网络请求类,核心代码在这里:

try {URL url = new URL(path);//1.改成sHttpsURLConnection conn = (HttpsURLConnection) url.openConnection();//2.SSLContext 初始化SSLContext tls = SSLContext.getInstance("TLS");MyX509TrustManager myX509TrustManager = new MyX509TrustManager(getX509Certificate(context));TrustManager[] trustManagers={myX509TrustManager};tls.init(null,trustManagers,new SecureRandom());//3.ssl工厂SSLSocketFactory factory = tls.getSocketFactory();//4.添加一个主机名称校验器conn.setHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {if (hostname.equals("kyfw.12306.cn")) {return true;}else{return false;}}});conn.setSSLSocketFactory(factory);conn.setRequestMethod("GET");conn.setReadTimeout(5000);conn.setConnectTimeout(5000);conn.connect();InputStream inputStream = conn.getInputStream();StringBuilder sb=new StringBuilder();int flag;byte[] buf=new byte[1024];while((flag=inputStream.read(buf))!=-1){sb.append(new String(buf,0,flag));}String s = sb.toString();//调用对方传入callback完成回调操作callBack.onSuccess(s);} catch (Exception e) {e.printStackTrace();callBack.onFail(e);}

主要的思路是:

1.先将我们常用的httpurlconnection变成HttpsConnection

2.初始化我们的SSLContext 这个类是ssl的一个帮助类,能够帮助我们去验证我们的证书文件

这个环节中其实稍微多一些操作,比如获取SSLContext的实例

SSLContext tls = SSLContext.getInstance("TLS");

还有创建SSLContext的初始化参数,这个MyX509TrustManager是我自己封装的类

MyX509TrustManager myX509TrustManager = new MyX509TrustManager(getX509Certificate(context));

封装的类如下

package com.guaju.httpsrequesttest.http;import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/*** Created by guaju on 2017/11/7.*/public class MyX509TrustManager implements X509TrustManager {//如果需要对证书进行校验,需要这里去实现,如果不实现的话是不安全 X509Certificate mX509Certificate;public MyX509TrustManager(X509Certificate mX509Certificate) {this.mX509Certificate = mX509Certificate;}@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {for (X509Certificate certificate:chain){//检查证书是否有效certificate.checkValidity();try {certificate.verify(mX509Certificate.getPublicKey());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (SignatureException e) {e.printStackTrace();}}}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
}

而上个类中传入的构造方法中的证书文件

X509Certificate mX509Certificate;

这个证书文件需要通过我们下载的证书去获得,12306的证书在官网首页,而我们如果开发自己的公司的网站的话,后台应该会给我们一份,我们拿着这个证书放到assets目录下(或者后台的服务器上)就可以转变成我们自己的签名了,下午是12306下载证书的地方:

下方是提供的将assets中的证书文件流转化成证书的方法,很简单:

//拿到自己的证书X509Certificate getX509Certificate(Context context) throws IOException, CertificateException {InputStream in = context.getAssets().open("srca.cer");CertificateFactory instance = CertificateFactory.getInstance("X.509");X509Certificate certificate = (X509Certificate) instance.generateCertificate(in);return certificate;}

创建TrustManager数组,将上方的MyX509TrustManager放进数组中去

TrustManager[] trustManagers={myX509TrustManager};

然后调用SSLContext的初始化方法

tls.init(null,trustManagers,new SecureRandom());

3.上方的sslcontext初始化好之后,我们就可以做SSLSocketFactory的创建了

SSLSocketFactory factory = tls.getSocketFactory();

然后把这个工厂为我们的连接conn设置上

conn.setSSLSocketFactory(factory);

4.添加主机名称校验器,记住这里的主机名称地址需要查看我们的证书的配置,不能瞎写

证书配置如下图

下方的名称及上方的常用名称

conn.setHostnameVerifier(new HostnameVerifier() {@Override
    public boolean verify(String hostname, SSLSession session) {if (hostname.equals("kyfw.12306.cn")) {return true;
        }else{return false;
            }}
});

这样的话就可以访问12306的注册页面了。

ok,为了方便大家使用,我已经提交到github了,如果大家觉得不错,记得star 或者fork哦 ,多谢~~~

github:https://github.com/guaju/HttpsRequestTest

android 使用https请求相关推荐

  1. 青花瓷抓包工具如何对Android手机https请求抓包及华为手机安装Charles证书方法详解!

    网上搜索了很多文档,这两篇是写的比较全面的,整个流程看完,你就会安装使用了! 参考:windows下使用Charles工具如何对android手机https请求进行抓包 参考:Android安装Cha ...

  2. android https请求证书过滤白名单,Android处理https请求的证书问题

    android中对部分站点发送https请求会报错,原因是该站点的证书时自定义的,而非官方的,android手机不信任其证书,为了解决这个问题,一般有两种解决方案 忽略证书验证 下载证书到本地,添加到 ...

  3. fiddler无法获取Android端https请求解决办法

    或者Fiddler2出现 creation of the root certificate was not successful 错误 1,设置fiddler代理 2,使用设备进入网址:localho ...

  4. java Android OKHttp HTTPS 请求证书验证 PEM证书(1)

    地址:http://blog.csdn.net/doubleping/article/details/53331864 调用new CustomTrust() 即可产生OkHttpClient 关键点 ...

  5. 在Mac下使用Charles抓取Android 7.0以上的Https请求

    文章目录 一.Charles 设置 1. 第一步 2. 第二步 3. 第三步 3. 第四步开启SSL代理功能 二.手机安装证书 三.APP 网络安全配置 四.另一种抓包方式   因为开发需求,需要抓取 ...

  6. Android 7.0解决抓取不到https请求的问题

    Android 7.0解决抓取不到https请求的问题 参考文章: (1)Android 7.0解决抓取不到https请求的问题 (2)https://www.cnblogs.com/meitian/ ...

  7. Android 使用自带的HttpClient进行https请求出现403的解决过程记录

    2019独角兽企业重金招聘Python工程师标准>>> 出现的过程 最近在用程序模拟一个web站的https登录,然后进行一些后续操作的小玩意.先使用java程序写测试代码,测试通过 ...

  8. android 监听本机网络请求_fiddler如何抓取https请求实现fiddler手机抓包-证书安装失败100%解决...

    一.HTTP协议和HTTPS协议. (1) HTTPS协议=HTTP协议+SSL协议,默认端口:443 (2) HTTP协议(HyperText Transfer Protocol):超文本传输协议. ...

  9. Android——自建CA证书,实现https请求

    Android 使用https 协议请求客户端 server端操作 自己创建 CA 证书 拿自建CA 证书创建 server 端证书 创建 https 服务 Android客户端操作 创建项目并引入相 ...

最新文章

  1. 随机选取字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  2. 牛津书虫系列双语读物
  3. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
  4. k-Means算法(Machine Learning in Action)基于python3.6
  5. JavaScript里的...(三个点)操作符
  6. vue获取当前时间和前一天时间_vue获取当前时间并实时刷新时间
  7. (01)odoo模型中调用窗体动作
  8. CSS 元素超出部分滚动, 并隐藏滚动条
  9. 统计学基础知识(一)
  10. c语言函数怎么返回,C语言函数的返回值应该怎么返回
  11. Ubuntu 18.04上使用snort3搭建NIDS(一)| 安装篇
  12. 增大或者减小图片大小的方法
  13. Yocto(一)-介绍
  14. Linux 重命名文件和文件夹
  15. pon终端测试仪_6304-PON终端测试仪报价_测试仪-北京海富达科技有限公司
  16. 电脑开机后进不了系统怎么办?
  17. 如何在ASP.NET网络应用实现数据可视化图表
  18. Nvidia AGX Xavier MAX9286 GMSL 载板
  19. JavaScript设计模式浅析
  20. ajax 的前因后果 以及优缺点

热门文章

  1. JAVA并发编程 之 LMAX Disruptor使用实例(高效解决生产者与消费者问题)
  2. 解决:NoClassdefFoundError:com.lmax.disruptor.EventHandler
  3. MySQL 8.0.25 下载与安装详细教程
  4. MDT 评测 — 华为 P30 Pro 屏幕素质报告
  5. canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
  6. L67.linux命令每日一练 -- 第十章 Linux网络管理命令 -- netstat和ss
  7. 计算机丢失qt5xml.dll,qt5xml.dll文件
  8. 如何下载建国门街道卫星地图高清版大图
  9. 两台路由器LAN-WAN级联,两台路由器下面的电脑能否互访
  10. 学习工作中的心态调整(不比钱)