В чем разница в реализации HTTPS для мобильных и десктопных приложений?

«В чем разница в реализации HTTPS для мобильных и десктопных приложений?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Протокол TLS/HTTPS одинаков, но различия касаются безопасности, управления сертификатами и сетевого окружения.

Аспект Мобильное приложение Десктопное приложение
Certificate Pinning Рекомендуется и часто используется. Публичный ключ или сертификат жестко вшивается в приложение для защиты от MITM-атак, даже если злоумышленник имеет доверенный корневой сертификат. Используется реже, но возможно. Чаще полагаются на системное хранилище сертификатов.
Источник доверия Может использовать как вшитые сертификаты, так и системное хранилище ОС (Keychain в iOS, KeyStore в Android). Практически всегда полагается на системное хранилище сертификатов ОС (Windows Certificate Store, macOS Keychain, Linux CA bundle).
Корпоративные прокси и MITM Могут сталкиваться с MITM-прокси в корпоративных сетях. Certificate Pinning может ломать такое соединение, требуя исключений. Чаще сталкиваются с корпоративными MITM-прокси, которые устанавливают свои корневые сертификаты в системное хранилище, поэтому соединение работает "прозрачно".
Обновление доверия Сложнее обновить закрепленные (pinned) ключи — требуется выпуск новой версии приложения. Проще: обновление списка доверенных центров сертификации (CA) происходит через ОС.
Производительность Проверка цепочки сертификатов и pinning на слабых устройствах может требовать оптимизации. Вычислительные ресурсы, как правило, достаточны.

Пример Certificate Pinning в Android (OkHttp):

val certificatePinner = CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
    .build()

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

Пример игнорирования ошибок SSL (НЕ для продакшена, только для тестов):

# Python (requests) - ОПАСНЫЙ ПРИМЕР, демонстрирующий разницу в подходе
import requests
import ssl

# Десктоп-подход (доверяет системным сертификатам)
response_safe = requests.get('https://api.example.com')

# Опасный обход проверки (иногда используется в тестах мобильных приложений с самоподписанными сертификатами)
response_unsafe = requests.get('https://api.example.com', verify=False)  # НЕ ДЕЛАЙТЕ ТАК В ПРОДАКШЕНЕ

Вывод: Мобильные приложения чаще используют агрессивные методы безопасности (pinning), жертвуя гибкостью, в то время как десктопные приложения больше полагаются на инфраструктуру и политики ОС.