android ssl双向验证 X509证书信任管理器类的实现及应用
在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
接口X509TrustManager有下述三个公有的方法需要我们实现:
⑴ oid checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。
⑵ oid checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。
⑶ X509Certificate[] getAcceptedIssuers()
返回受信任的X509证书数组。
自己实现了信任管理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任管理器。其实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。下面用一个图简单表示这几个JSSE类的关系:
图1 部分JSSE类的关系图
假设自己实现的X509TrustManager类的类名为:MyX509TrustManager,下面的代码片断说明了如何使用MyX509TrustManager:
//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager ()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
//创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
HttpsURLConnection httpsConn = (HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);
这样,HttpsURLConnection对象就可以正常连接HTTPS了,无论其证书是否经权威机构的验证,只要实现了接口X509TrustManager的类MyX509TrustManager信任该证书。
小结
本文主要介绍了在HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法,一种方法是把该证书导入到Java的TrustStore文件中,另一种是自己实现并覆盖JSSE缺省的证书信任管理器类。两种方法各有优缺点,第一种方法不会影响JSSE的安全性,但需要手工导入证书;第二种方法虽然不用手工导入证书,但需要小心使用,否则会带来一些安全隐患。
android ssl双向验证 X509证书信任管理器类的实现及应用相关推荐
- 请求https,X509证书信任管理器类,避免导证书
实现X509证书信任管理器类(避免导证书) package com.showlin.httpsDemo;import javax.net.ssl.X509TrustManager; import ja ...
- 请给你的短信验证码接口加上SSL双向验证
序言 去年年底闲来几天,有位同事专门在网上找一些注册型的app和网站,研究其短信接口是否安全,半天下来找到30来家,一些短信接口由于分析难度原因,没有继续深入,但差不多挖掘到20来个,可以肆意被调用, ...
- Android平台手机UI应用开发——软件管理器
第一次写博客,与大家分享源代码,博客很多地方不知道怎么设计,望见谅. 希望大家多多支持,雅林和大家一起学习Android,共同进步. 今天我们要做的这个软件管理器,主要目的是为了学习Android平台 ...
- DriverManager 驱动管理器类简介 JDBC简介(三)
驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...
- Django中--自定义模型管理器类
BookInfo.objects.all()->objects是一个什么东西呢? 答:objects是models.Manger类的一个对象,是Django帮我自动生成的管理器对象,通过这个管理 ...
- Django:admin管理后台2,ModelAdmin模型管理器类
https://docs.djangoproject.com/zh-hans/3.2/ref/contrib/admin/ admin.py from django.contrib import ad ...
- 【Django入门】——模型管理器对象、模型管理器类和模型类
文章目录 一.模型管理器对象 1. 自定义模型管理器对象 2. 自定义模型管理器类 3. 自定义模型管理器类应用 3.1 重写框架的方法 3.2 封装自定义方法 4. 模型管理器对象的`model`属 ...
- Python Django,模型,模型管理器类(models.Manager)(与数据库交互的接口),自定义模型管理器类
模型类.objects.all() ---> objects是Django自动生成的管理器对象,通过这个管理器对象可以实现与数据库的交互. 定义模型类时可以为模型类指定自定义的管理类对象,指定后 ...
- cocos植物大战僵尸(五)选择植物卡片:待选择植物卡片管理器类
2.4.2 待选择植物卡片管理器类 此类管理所有本关卡能选择的卡片. //从关卡配置文件中读取坐标,卡片名并显示出来 bool CWaitChooseCardMgr::levelConfigLoad( ...
- Django中数据对象的增删改查常用方法,自定义管理器类,过滤器及F和Q对象等知识点总结
Django对象的增删改查 我们为了对django对象的增删改查进行总结,先在model.py文件中创建类便于举例 定义学生: class Students(models.Model):sname=m ...
最新文章
- python中文编辑器推荐-八款Python编辑器对比介绍推荐
- cdh sqoop 配置_相比于手动搭建集群,使用Ambari或者CDH的必要性
- 【渝粤教育】国家开放大学2019年春季 0408-22T管理学基础 参考试题
- MachineLearning(5)-去量纲:归一化、标准化
- mysql主从同步搭建和故障排除
- 《计算机网络》第二章:物理层(The Physical Layer)
- sqlite 附加和分离数据库
- java经典错误语句_【Java】Java代码经典错误清单
- OSN3500 华为SDH全新板卡备件升级扩容
- Ubuntu菜单栏和任务栏不见了 解决方案
- linux shell 脚本复制特定后缀文件到另外一个文件夹下
- matlab拷贝不进u盘,Mac无法拷贝文件到U盘怎么办
- Arduino基础入门篇26—步进电机
- 京东上千页面搭建基石——CMS前后端分离演讲史读后感
- word跨文件格式刷的方法
- Java、JavaScript、C语言数组的创建
- 任务型对话(二)—— DST(对话状态追踪)
- 伺服控制原理 及RT and IRT
- kubernetes-v1.15.0安装【使用kubeadm部署Kubernetes-跳过国内网络问题】
- 肥牛是不是牛肉,为什么?