博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求
阅读量:5022 次
发布时间:2019-06-12

本文共 3611 字,大约阅读时间需要 12 分钟。

为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如:

  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
  • HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

但是即使使用HTTPS有很多有点,但是购买一个认证的HTTPS证书却价格不菲,增加了初创企业和小团队的开发成本。而且如上面所说,使用HTTPS并非绝对的安全,传输的数据并非没有办法获取到,我的之前一篇博客所使用的方法已成功截取HTTPS的数据传输。有兴趣的可以参考:。

为了节约成本,我们可以选择使用自签名的HTTPS。

这种方式我们可以自己生成证书,不需要购买证书,但是使用这种方式的域名如果在浏览器中访问的话,会有一个不安全的标识。但是如果用在客户端上,就不会有这个问题,现在一些应用商店也要求APP上架时需要使用HTTPS的网络请求(比如AppStore),使用这种自签名的HTTPS同样也能过审。

本文我们介绍在Android上使用网络请求框架Retrofit 2来请求自签名的API,关于如何生成HTTPS证书,我们将在另一篇博客中进行说明,敬请期待。或者您可以自行查找相关资料。

配置证书

比如我们生成的SLL证书文件为"api_ssl_debug.cer",我们将其放到assets目录下。这样在配置Retrofit的时候就可以读取该证书并用于API请求中。

配置Retrofit

本节我们介绍SSL证书在Retrofit中的配置,首先我们要定义两个方法用来读取证书,然后讲该证书用于Retrofit中。

  1. 读取证书内容到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;    }
  1. 生成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);        }    }
  1. 配置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的其它配置,可以根据工程需要进行配置。

总结

至此,使用Retrofit就可以进行自签名的HTTPS的网络请求了,当然,服务器端的API配置也需要进行HTTPS的配置,我将在服务端相关的博客进行介绍,还有一点,如果请求的域名指定了端口,要将端口设置为443。如果没有指定端口,请求时也会自动走443端口。

,如有更多疑问,请参考我的其它Android相关博客:

转载于:https://www.cnblogs.com/lloyd-zh/p/9816897.html

你可能感兴趣的文章
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>
【转】常用的latex宏包
查看>>
[TMS320C674x] 一、GPIO认识
查看>>
酷狗的皮肤文件存放在哪
查看>>
iOS RunLoop简介
查看>>
C++的引用
查看>>
T-SQL查询进阶--深入浅出视图
查看>>
MapKeyboard 键盘按键映射 机械革命S1 Pro-02
查看>>
Android读取url图片保存及文件读取
查看>>
完整ASP.Net Excel导入
查看>>
判断CPU大小端示例代码
查看>>
ARTS打卡第13周
查看>>
循环队列的运用---求K阶斐波那契序列
查看>>
pta 编程题14 Huffman Codes
查看>>
初始化bootstrap treeview树节点
查看>>
python selenium向<sapn>标签中写入内容
查看>>
JS常用坐标
查看>>
使用”结构化的思考方式“来编码和使用”流程化的思考方式“来编码,孰优孰劣?...
查看>>