面临的问题?
安全要做到哪种程度?
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/