← Назад к вопросам

Как подключить SSL сертификат в проект

2.0 Middle🔥 112 комментариев
#Производительность и оптимизация#Сетевое взаимодействие

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Настройка SSL-сертификата в Android-приложении

Подключение SSL-сертификата в Android-проекте — критически важная задача для обеспечения безопасного сетевого взаимодействия. Вот подробное руководство по различным сценариям.

1. Работа с доверенными сертификатами (Let's Encrypt, коммерческие CA)

Когда сервер использует сертификат от общепризнанного центра сертификации (CA), Android по умолчанию доверяет ему через системный хранилище сертификатов. Однако есть нюансы:

// Пример безопасного HTTPS-соединения с OkHttp
val client = OkHttpClient.Builder()
    .connectTimeout(30, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build()

val request = Request.Builder()
    .url("https://api.example.com/data")
    .build()

client.newCall(request).enqueue(object : Callback {
    override fun onResponse(call: Call, response: Response) {
        // Обработка успешного ответа
    }
    
    override fun onFailure(call: Call, e: IOException) {
        // Обработка ошибок SSL может потребоваться здесь
    }
})

2. Самоподписанные сертификаты и кастомные CA

Для внутренних серверов или staging-окружений часто используются самоподписанные сертификаты. Вот как настроить их поддержку:

Вариант A: Добавление сертификата в хранилище доверия

// Создание кастомного TrustManager
fun createCustomTrustManager(context: Context): X509TrustManager {
    val certificateFactory = CertificateFactory.getInstance("X.509")
    val inputStream = context.resources.openRawResource(R.raw.my_certificate)
    val certificate = certificateFactory.generateCertificate(inputStream)
    
    val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
    keyStore.load(null, null)
    keyStore.setCertificateEntry("my_ca", certificate)
    
    val trustManagerFactory = TrustManagerFactory.getInstance(
        TrustManagerFactory.getDefaultAlgorithm()
    )
    trustManagerFactory.init(keyStore)
    
    return trustManagerFactory.trustManagers.first() as X509TrustManager
}

// Настройка OkHttpClient с кастомным TrustManager
val trustManager = createCustomTrustManager(context)
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, arrayOf(trustManager), null)

val client = OkHttpClient.Builder()
    .sslSocketFactory(sslContext.socketFactory, trustManager)
    .build()

Вариант B: Отключение проверки SSL (ТОЛЬКО для отладки!)

// НИКОГДА не используйте в production!
fun getUnsafeOkHttpClient(): OkHttpClient {
    val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
        override fun checkClientTrusted(
            chain: Array<out X509Certificate>?, 
            authType: String?
        ) = Unit
        
        override fun checkServerTrusted(
            chain: Array<out X509Certificate>?, 
            authType: String?
        ) = Unit
        
        override fun getAcceptedIssuers() = arrayOf<X509Certificate>()
    })
    
    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, trustAllCerts, java.security.SecureRandom())
    
    return OkHttpClient.Builder()
        .sslSocketFactory(sslContext.socketFactory, trustAllCerts[0] as X509TrustManager)
        .hostnameVerifier { _, _ -> true } // Отключает проверку имени хоста
        .build()
}

3. Network Security Configuration (API 24+)

Самый современный и рекомендуемый подход — использование файла конфигурации сетевой безопасности:

res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- Доверие самоподписанному сертификату -->
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_certificate"/>
            <certificates src="system"/> <!-- Системные сертификаты -->
        </trust-anchors>
    </domain-config>
    
    <!-- Отключение защиты для отладки -->
    <debug-overrides>
        <trust-anchors>
            <certificates src="user"/> <!-- Пользовательские сертификаты -->
        </trust-anchors>
    </debug-overrides>
    
    <!-- Базовые настройки -->
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

AndroidManifest.xml:

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

4. Certificate Pinning (Закрепление сертификата)

Для максимальной безопасности используйте certificate pinning:

// Закрепление открытого ключа сертификата
val certificatePinner = CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAA=") // Ваш хэш
    .add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBB=") // Backup хэш
    .build()

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

5. Практические рекомендации

  • Разделение окружений: используйте разные конфигурации для debug и release
  • Ротация сертификатов: предусмотрите механизм обновления закрепленных сертификатов
  • Обработка ошибок: корректно обрабатывайте SSLHandshakeException
  • Анализ трафика: для отладки используйте Charles Proxy или Fiddler с установкой их сертификатов
  • Минимальные версии TLS: настройте поддержку TLS 1.2+

6. Проверка реализации

# Проверка сертификата сервера
openssl s_client -connect example.com:443 -showcerts

# Извлечение хэша для pinning
openssl x509 -in certificate.pem -pubkey -noout | \
    openssl rsa -pubin -outform der | \
    openssl dgst -sha256 -binary | \
    openssl enc -base64

Важные предостережения:

  1. Никогда не отключайте проверку SSL в production-сборках
  2. Регулярно обновляйте закрепленные сертификаты
  3. Используйте Network Security Configuration для API 24+
  4. Тестируйте на разных версиях Android
  5. Учитывайте особенности самоподписанных сертификатов в WebView

Правильная настройка SSL обеспечивает защиту от MITM-атак и повышает общую безопасность приложения.

Как подключить SSL сертификат в проект | PrepBro