Android 网络安全之https

简单说一下 http 和https 的区别 http是应用层协议 而https是http 的升级版 是网络安全大趋势之下的产物 在现有条件下 常规的http已经无法保证数据和平台的安全,所以https 已成大势 目前的http 通过一些工具是可以抓取到数据的 例如Fiddler ,charles 就能轻易抓取http的请求数据 而https 则可以轻松避免这种抓取数据的方式
http 请求是通过 http + tcp 进行的应用传输的 而https 则是在http 和 tcp 之间加了一层安全验证也就是 SSL/TLS的验证 数据证书验证是使用CA证书(数据证书颁发机构办法的证书)进行密码校验 通过验证才能进行网络请求

下面说一下android 的https (以okhttp为例)

先说下本人的策略 使用二级缓存的方法进行证书加载 现在很多朋友大都是以硬编码的方式或内置证书的方式加载 本人觉得这种方式是不安全的 第一不安全是因为有意破坏者可以通过反编译 或者 破解获取你的证书 第二 ca证书是由时间限制的 如果时间到期 再去更换证书 而你只能通过强制更新才能让用户进行使用 这个会给用户很不好的体验

我的策略是 内置加缓存的方式加载证书 首先缓存是需要权限的 若用户没有授权 则终端无法缓存 用户也就无法正常使用 此时我使用内置的 如果客户授权了读写权限 我就是用缓存的 以此避免证书过期问题

证书验证 也有两种方式 第一 单项验证(弱验证)(服务器验证客户端携带的证书是否有效)第二 双向验证(强验证) 客户端验证
服务端握手时返回的公钥信息进行host验证 服务器在验证客户端的数字签名是否正确 一般双向验证是 浏览器金融类app等使用的较多 也是非常安全的一种方式 ; 我使用的是第一种单项验证 因为我的host是我自己设定好的 所以我没有进行host 验证

public class SSLUtil {

    /**
     * 获取SSLSocketFactory
     *
     * @param certificates 证书流文件
     * @return
     */
    public static SSLSocketFactory getSSLSocketFactory(InputStream... certificates) {

        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            for (InputStream certificate : certificates) {
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
                try {
                    if (certificate != null)
                        certificate.close();
                } catch (IOException e) {
                }
            }
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

返回SSLSocketFactory 

// 网络请求方法
OkHttpClient.Builder okBuilder = new OkHttpClient.Builder().addInterceptor(interceptor)
               .writeTimeout(BaseConstant.NET_WRITE_TIME_OUT, TimeUnit.SECONDS)
               .readTimeout(BaseConstant.NET_READ_TIME_OUT, TimeUnit.SECONDS)
               .connectTimeout(BaseConstant.NET_REQUEST_TIME_OUT, TimeUnit.SECONDS)
               .retryOnConnectionFailure(true)
               .addInterceptor(new ErrorStatuInterceptor())
               .addInterceptor(new PrintLogInterceptor());
       if (CA.getCAFile()!=null){
           if (SSLUtil.getSSLSocketFactory(CA.getCAByte()) != null){
               okBuilder.hostnameVerifier(new HostnameVerifier() {
                   @Override
                   public boolean verify(String s, SSLSession sslSession) {
                       return true;
                   }
                 }).sslSocketFactory(SSLUtil.getSSLSocketFactory(CA.getCAByte()));
           }
       }else {
           if (SSLUtil.getSSLSocketFactory(CA.getCAByte()) != null){
               try {
                   okBuilder.hostnameVerifier(new HostnameVerifier() {
                       @Override
                       public boolean verify(String s, SSLSession sslSession) {
                           return true;
                       }
                   }).sslSocketFactory(SSLUtil.getSSLSocketFactory(UiUtils.getContext().getAssets().open("nade.cer")));
               } catch (IOException e) {
                   e.printStackTrace();
               }
               //  }).sslSocketFactory(SSLUtil.getSSLSocketFactory(CA.getCAByte()));
           }

       }

// 此方法用于验证host 返回true 是不验证

 okBuilder.hostnameVerifier(new HostnameVerifier() {
                   @Override
                   public boolean verify(String s, SSLSession sslSession) {
                       return true;
                   }

这个可以可以根据需要进行验证

好了 不多说 到此结束 有需要可以私信我

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 1,从素材到线稿,将素材概括重组一下,提炼出哪些重点刻画,哪些虚化。 将远山变虚,重点刻画近景的人物。因为画...
    步摇阅读 826评论 0 2
  • 使用dispatch_once的注意事项: 此函数接收类型为dispatch_once_t的特殊参数,还有一个块参...
    皆为序幕_阅读 293评论 0 0
  • 一直以来,我都很喜欢一句话——我哒哒的马蹄是个美丽的错误,我不是归人,我只是个过客。 是啊,我不愿把路过我人生的人...
    今心何兮阅读 570评论 0 2