android - API <24 上的 Android 网络安全
问题描述
为了从我的 android 应用程序返回通信,我使用 network-security-config.xml,它看起来像
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="@raw/my_ca"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
my_ca 在哪里 - 证书(.pem 文件)
在 API < 24 上它不起作用,如何解决这个问题?
解决方案
Android 7 (API 24) 中添加了声明性网络安全配置。在此之前,您必须以编程方式进行。不幸的是,这并不简单,步骤是:
- 把证书放在一个
KeyStore
- 创建一个
X509TrustManager
- 创建一个
SSLSocketFactory
- 建立一个
OkHttpClient
- 在
Retrofit
构建器中使用客户端
有OkHttp 配方描述了这一点。
似乎还有一个带有更简单 API的OkHttp 扩展:
val certificate = """-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE
""".decodeCertificatePem()
val certificates: HandshakeCertificates = HandshakeCertificates.Builder()
.addTrustedCertificate(certificate)
.addPlatformTrustedCertificates()
.build()
val client = OkHttpClient.Builder()
.sslSocketFactory(certificates.sslSocketFactory(), certificates.trustManager)
.build()
Retrofit.Builder()
.client(client)
...
.build()
.create(MyWebService::class.java)
java中构建OkHttp客户端的类似示例
推荐阅读
- r - r 散点图和回归线问题
- java - 在 CoordinatorLayout 中禁用 AppBarLayout 时 RecyclerView 滚动故障?
- css - 放大时保持整个页面(水平滚动条位置)居中
- c++ - 在没有 UB 的情况下使用 [base+index*scale] 寻址两个不相关的数组
- swift - 如何从模型中获取数据并更新它
- sql - SQL将covid患者分配到医院
- javascript - 我的 javascript 函数无法正常工作
- reactjs - TypeError:在获取后执行调度函数时无法读取未定义的属性“then”
- algorithm - 非树表示的最大独立集
- laravel - 如何测试作业失败的功能