Ответ
Добавить SSL-сертификат в Android можно несколькими способами:
- Добавление в TrustStore (для кастомных CA):
val keyStore = KeyStore.getInstance("BKS")
val inputStream = context.resources.openRawResource(R.raw.my_cert)
keyStore.load(inputStream, "password".toCharArray())
val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustManagerFactory.init(keyStore)
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustManagerFactory.trustManagers, null)
- Network Security Config (API 24+):
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_cert"/>
</trust-anchors>
</domain-config>
</network-security-config>
И добавить в манифест:
<application android:networkSecurityConfig="@xml/network_security_config">
- OkHttp CertificatePinner (для pinning):
val certPinner = CertificatePinner.Builder()
.add("example.com", "sha256/AAAAAAAA...")
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certPinner)
.build()
Для самоподписанных сертификатов лучше использовать первый или второй способ. Certificate Pinning подходит для дополнительной защиты против MITM-атак.