android https解析
程序员文章站
2022-05-03 13:09:08
https简介
https 全称 http over tls。tls是在传输层上层的协议,应用层的下层,作为一个安全层而存在,翻译过来一般叫做传输层安全协议。
对 http 而言,安全传输层是透明不...
https简介
https 全称 http over tls。tls是在传输层上层的协议,应用层的下层,作为一个安全层而存在,翻译过来一般叫做传输层安全协议。
对 http 而言,安全传输层是透明不可见的,应用层仅仅当做使用普通的 socket 一样使用 sslsocket 。
tls是基于 x.509 认证,他假定所有的数字证书都是由一个层次化的数字证书认证机构发出,即 ca。另外值得一提的是 tls 是独立于 http 的,任何应用层的协议都可以基于 tls 建立安全的传输通道,如 ssh 协议。
https工作流程
client server
1.request. 公钥(锁头)
2.client校验证书(过期时间、颁发机构)
3.生成随机数,将随机数发送给服务端
4.c/s通过随机值当key数据传输
ca要解决的问题
通过公钥使用提供的验证策略
certificatefactory certificatefactory = certificatefactory.getinstance("x.509"); inputstream cainput = new bufferedinputstream(cc.getapplication().getassets().open("aoscagsorganizationvalsha2g2r1.crt")); certificate ca=certificatefactory.generatecertificate(cainput); logger.v("fasfasf", "ca=" + ((x509certificate) ca).getsubjectdn()); logger.v("fasfasf", "key=" + ((x509certificate) ca).getpublickey()); keystore keystore = keystore.getinstance(keystore.getdefaulttype()); keystore.load(null); keystore.setcertificateentry("ca",ca); trustmanagerfactory tmf =trustmanagerfactory.getinstance(trustmanagerfactory.getdefaultalgorithm()); tmf.init(keystore);
sslcontext sslcontext = sslcontext.getinstance("tls"); sslcontext.init(null,tmf.gettrustmanagers(), new securerandom()); sslsocketfactory = sslcontext.getsocketfactory();
if (sslsocketfactory != null) { httpsurlconnection.setdefaultsslsocketfactory(sslsocketfactory); // httpsurlconnection.setdefaulthostnameverifier(new hostnameverifier() { @override public boolean verify(string hostname, sslsession session) { boolean istrustdns= configerhelper.getinstance().istrustdns(hostname); logger.v(tag, "istrustdns "+istrustdns); return istrustdns; }}); // httpsurlconnection.sethostnameverifier(new hostnameverifier() { // @override // public boolean verify(string hostname, sslsession session) { // boolean istrustdns= configerhelper.getinstance().istrustdns(hostname); // logger.v(tag, "istrustdns "+istrustdns); // return istrustdns; // } // }); }
自定义验证策略
if (sagroupsslsocketfactory == null) { try { trustmanager[] trustmanagers=new trustmanager[]{ new x509trustmanager() { @override public void checkclienttrusted(x509certificate[] chain, string authtype) throws certificateexception { } @override public void checkservertrusted(x509certificate[] chain, string authtype) throws certificateexception { //暂时不做证书校验 } @override public x509certificate[] getacceptedissuers() { return new x509certificate[0]; } } }; sslcontext sslcontext = sslcontext.getinstance("tls"); sslcontext.init(null,trustmanagers, new securerandom()); sslsocketfactory = sslcontext.getsocketfactory(); } catch (throwable e) { logger.v("fasfasf",""+e.getmessage()); // debuglog.error(e.getmessage(), e); } }
上一篇: ASP 中 DateDiff 函数详解 主要实现两日期加减操作
下一篇: 茶叶怎么做,品茶前先制茶
推荐阅读
-
Android TextView文字,删除线以及下划线的实现
-
Android TabLayout和ViewPager关联原理分析
-
C++实践:正则表达式解析声卡参数
-
对python For 循环的三种遍历方式解析
-
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
-
读《 NFC:Arduino、Android与PhoneGap近场通信》 有感——智能的电磁场交互
-
Linux-6.5下基于cmake28来编译安装mysql服务配置解析_MySQL
-
PHP的学习--解析URL
-
解析web响应式布局中iframe自适应的方法
-
浏览器解析js生成的html出现样式问题的解决方法_javascript技巧