android 使用https请求
今年年初就已经吵吵着要把大部分的服务端由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请求相关推荐
- 青花瓷抓包工具如何对Android手机https请求抓包及华为手机安装Charles证书方法详解!
网上搜索了很多文档,这两篇是写的比较全面的,整个流程看完,你就会安装使用了! 参考:windows下使用Charles工具如何对android手机https请求进行抓包 参考:Android安装Cha ...
- android https请求证书过滤白名单,Android处理https请求的证书问题
android中对部分站点发送https请求会报错,原因是该站点的证书时自定义的,而非官方的,android手机不信任其证书,为了解决这个问题,一般有两种解决方案 忽略证书验证 下载证书到本地,添加到 ...
- fiddler无法获取Android端https请求解决办法
或者Fiddler2出现 creation of the root certificate was not successful 错误 1,设置fiddler代理 2,使用设备进入网址:localho ...
- java Android OKHttp HTTPS 请求证书验证 PEM证书(1)
地址:http://blog.csdn.net/doubleping/article/details/53331864 调用new CustomTrust() 即可产生OkHttpClient 关键点 ...
- 在Mac下使用Charles抓取Android 7.0以上的Https请求
文章目录 一.Charles 设置 1. 第一步 2. 第二步 3. 第三步 3. 第四步开启SSL代理功能 二.手机安装证书 三.APP 网络安全配置 四.另一种抓包方式 因为开发需求,需要抓取 ...
- Android 7.0解决抓取不到https请求的问题
Android 7.0解决抓取不到https请求的问题 参考文章: (1)Android 7.0解决抓取不到https请求的问题 (2)https://www.cnblogs.com/meitian/ ...
- Android 使用自带的HttpClient进行https请求出现403的解决过程记录
2019独角兽企业重金招聘Python工程师标准>>> 出现的过程 最近在用程序模拟一个web站的https登录,然后进行一些后续操作的小玩意.先使用java程序写测试代码,测试通过 ...
- android 监听本机网络请求_fiddler如何抓取https请求实现fiddler手机抓包-证书安装失败100%解决...
一.HTTP协议和HTTPS协议. (1) HTTPS协议=HTTP协议+SSL协议,默认端口:443 (2) HTTP协议(HyperText Transfer Protocol):超文本传输协议. ...
- Android——自建CA证书,实现https请求
Android 使用https 协议请求客户端 server端操作 自己创建 CA 证书 拿自建CA 证书创建 server 端证书 创建 https 服务 Android客户端操作 创建项目并引入相 ...
最新文章
- 随机选取字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
- 牛津书虫系列双语读物
- linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
- k-Means算法(Machine Learning in Action)基于python3.6
- JavaScript里的...(三个点)操作符
- vue获取当前时间和前一天时间_vue获取当前时间并实时刷新时间
- (01)odoo模型中调用窗体动作
- CSS 元素超出部分滚动, 并隐藏滚动条
- 统计学基础知识(一)
- c语言函数怎么返回,C语言函数的返回值应该怎么返回
- Ubuntu 18.04上使用snort3搭建NIDS(一)| 安装篇
- 增大或者减小图片大小的方法
- Yocto(一)-介绍
- Linux 重命名文件和文件夹
- pon终端测试仪_6304-PON终端测试仪报价_测试仪-北京海富达科技有限公司
- 电脑开机后进不了系统怎么办?
- 如何在ASP.NET网络应用实现数据可视化图表
- Nvidia AGX Xavier MAX9286 GMSL 载板
- JavaScript设计模式浅析
- ajax 的前因后果 以及优缺点
热门文章
- JAVA并发编程 之 LMAX Disruptor使用实例(高效解决生产者与消费者问题)
- 解决:NoClassdefFoundError:com.lmax.disruptor.EventHandler
- MySQL 8.0.25 下载与安装详细教程
- MDT 评测 — 华为 P30 Pro 屏幕素质报告
- canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
- L67.linux命令每日一练 -- 第十章 Linux网络管理命令 -- netstat和ss
- 计算机丢失qt5xml.dll,qt5xml.dll文件
- 如何下载建国门街道卫星地图高清版大图
- 两台路由器LAN-WAN级联,两台路由器下面的电脑能否互访
- 学习工作中的心态调整(不比钱)