我们应该怎么做android https 客户端校验未完待续

面临的问题?

安全要做到哪种程度?

android系统校验策略?

应该怎么做校验?

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要解决的问题



通过公钥使用系统提供的验证策略

android系统本身会维护一个信任证书链根,如果用系统证书链校验存在一个问题,非法CA可以将自己的证书添加到系统信任列表,这样对于系统来说就是一个被信任的证书,故不安全。

因android系统开源,各个厂商内置的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);
            }
        }


to be continued


引用:

https://developer.android.com/training/articles/security-ssl?hl=zh-cn

https://cloud.tencent.com/developer/article/1005073

android根证书管理:https://www.wolfcstech.com/2018/03/20/android_cert_mgr_and_verify/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值