Какие знаешь способы добавления SSL сертификата в Android

«Какие знаешь способы добавления SSL сертификата в Android» — вопрос из категории Сети, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Добавить SSL-сертификат в Android можно несколькими способами:

  1. Добавление в 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)
  1. 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">
  1. OkHttp CertificatePinner (для pinning):
val certPinner = CertificatePinner.Builder()
    .add("example.com", "sha256/AAAAAAAA...")
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certPinner)
    .build()

Для самоподписанных сертификатов лучше использовать первый или второй способ. Certificate Pinning подходит для дополнительной защиты против MITM-атак.