内容简介:为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如:但是即使使用HTTPS有很多有点,但是购买一个认证的HTTPS证书却价格不菲,增加了初创企业和小团队的开发成本。而且如上面所说,使用HTTPS并非绝对的安全,传输的数据并非没有办法获取到,我的之前一篇博客所使用的方法已成功截取HTTPS的数据传输。有兴趣的可以参考:为了节约成本,我们可以选择使用自签名的HTTPS。
为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如:
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
但是即使使用HTTPS有很多有点,但是购买一个认证的HTTPS证书却价格不菲,增加了初创企业和小团队的开发成本。而且如上面所说,使用HTTPS并非绝对的安全,传输的数据并非没有办法获取到,我的之前一篇博客所使用的方法已成功截取HTTPS的数据传输。有兴趣的可以参考: 使用Charles对Android App的https请求进行抓包 。
为了节约成本,我们可以选择使用自签名的HTTPS。
这种方式我们可以自己生成证书,不需要购买证书,但是使用这种方式的域名如果在浏览器中访问的话,会有一个不安全的标识。但是如果用在客户端上,就不会有这个问题,现在一些应用商店也要求APP上架时需要使用HTTPS的网络请求(比如AppStore),使用这种自签名的HTTPS同样也能过审。
本文我们介绍在Android上使用网络请求框架Retrofit 2来请求自签名的API,关于如何生成HTTPS证书,我们将在另一篇博客中进行说明,敬请期待。或者您可以自行查找相关资料。
配置证书
比如我们生成的SLL证书文件为”api_ssl_debug.cer”,我们将其放到assets目录下。这样在配置Retrofit的时候就可以读取该证书并用于API请求中。
配置Retrofit
本节我们介绍SSL证书在Retrofit中的配置,首先我们要定义两个方法用来读取证书,然后讲该证书用于Retrofit中。
- 读取证书内容到KeyStore中
private static KeyStore getKeyStore(String fileName) { KeyStore keyStore = null; try { AssetManager assetManager = Utils.getApp().getAssets(); CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = assetManager.open(fileName); Certificate ca; try { ca = cf.generateCertificate(caInput); Log.d("SslUtils", "ca=" + ((X509Certificate) ca).getSubjectDN()); } finally { caInput.close(); } String keyStoreType = KeyStore.getDefaultType(); keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca); } catch (Exception e) { Log.e("SslUtils", "Error during getting keystore", e); } return keyStore; }
- 生成SSLContext以便用于Retrofit的配置中
public static SSLContext getSslContextForCertificateFile(String fileName) { try { KeyStore keyStore = SslUtils.getKeyStore(fileName); SSLContext sslContext = SSLContext.getInstance("SSL"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); return sslContext; } catch (Exception e) { String msg = "Error during creating SslContext for certificate from assets"; Log.e("SslUtils", msg, e); throw new RuntimeException(msg); } }
- 配置Retrofit
SSLContext sslContext = SslUtils.getSslContextForCertificateFile("api_ssl_debug.cer"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); } X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; OkHttpClient.Builder builder = new OkHttpClient.Builder() ... .sslSocketFactory(sslContext.getSocketFactory(), trustManager) .hostnameVerifier((hostname, session) -> true) ... mRetrofit = new Retrofit.Builder() ... build();
以上的省略号为Retrofit的其它配置,可以根据工程需要进行配置。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- OpenSSL命令速查手册:证书、私钥与证书签名请求文件
- RHCE证书,CCNA证书
- DV SSL证书和其他证书有什么不同?
- 生成根证书CA及签发子证书及配置站点实践
- 技术讨论 | Apostille:让假证书以假乱真的证书伪造工具
- 360浏览器推出自有根证书计划 吁加快证书安全技术改造
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。