iOS: профиль установлен, но сертификату нет доверия
На iOS корневой сертификат ставится в два шага, а не в один. Второй спрятан в «Об этом устройстве», и без него не работает ничего.
Что это значит
Профиль установлен, но Safari всё равно пишет, что соединение не защищено, а в прокси пусто. На iOS корневой сертификат ставится в два шага: установить, потом доверять. Apple развела эти шаги в iOS 10.3. Пока доверие не включено вручную, сертификат не делает ничего.
Как исправить
Сначала пропишите прокси в настройках Wi-Fi. Это делается отдельно.
Шаг 1. Установить профиль.
Откройте адрес сертификата в Safari. Другие браузеры на iOS просто сохранят файл, и «Настройки» не предложат его установить.
Safari спросит, разрешить ли загрузку. Разрешите. Дальше: «Настройки» → «Профиль загружен» (ближе к верху, под сведениями об аккаунте) → «Установить» → код-пароль → «Установить» ещё раз → «Готово».
Два ограничения. Загруженный профиль удаляется через 8 минут, если его не установить, и в очереди всегда только один профиль. Если строки нет, скачайте сертификат заново.
Шаг 2. Включить полное доверие. Этот шаг и пропускают.
«Настройки» → «Основные» → «Об этом устройстве» → в самом низу → «Настройки доверия сертификатов» → включите переключатель напротив вашего сертификата, в разделе «Включить полное доверие для корневых сертификатов». iOS предупредит, что это даёт владельцу сертификата право читать ваш трафик. Предупреждение верное. Владелец здесь вы.
Шаг 3. Проверить. Откройте в Safari любой https-сайт. Ошибки нет, в прокси появились запросы, значит готово.
Отдельные случаи
До шага 2 профиль помечен «Не проверено». Эта красная строка в «Настройки» → «Основные» → «VPN и управление устройством» → ваш профиль. Это норма: после включения полного доверия она станет «Проверено».
Переключателя нет. Две причины. Сертификат не корневой: он должен быть
самоподписанным и нести basicConstraints с выставленным cA
(RFC 5280, пункт 4.2.1.9). Либо его поставили через MDM или Apple
Configurator: такие сертификаты получают доверие сразу, и переключателя для них
не бывает.
Рабочий телефон под управлением. Администратор MDM может вообще запретить установку профилей. Тогда шаг 1 не пройдёт и доверять будет нечему.
Симулятор. Одна команда, без тапов:
xcrun simctl keychain booted add-root-cert /path/to/ca.cer
Она пишет сертификат прямо в хранилище доверия симулятора, так что шаг 2 не
нужен. Перетащить .cer на окно симулятора тоже можно, но тогда шаг 2 придётся
сделать внутри симулятора.
Приложение с пиннингом. Доверие на уровне системы ему безразлично: приложение, которое проверяет сертификат само, откажется от соединения. Лечится только в коде.
App Transport Security. NSAllowsArbitraryLoads советуют часто и напрасно.
ATS принимает корневой сертификат, которому пользователь дал полное доверие.
Отключать ATS ради прокси не нужно: в релизной сборке за это придётся
объясняться на ревью в App Store.
Сбитые часы. У сертификата есть срок действия (RFC 5280, пункт 4.1.2.5). Если дата на телефоне неверная, iOS считает сертификат просроченным и отказывает даже при включённом доверии. «Настройки» → «Основные» → «Дата и время» → «Автоматически».
Старый сертификат от другого прокси. В хранилище лежат два корневых сертификата, и телефон может взять не тот. Удалите лишний: «Настройки» → «Основные» → «VPN и управление устройством» → профиль → «Удалить профиль».
Как увидеть это у себя
После шага 2 запросы с телефона приходят целиком: хост, путь, заголовки, тело. До него видно только соединения к 443-му порту, которые открываются и обрываются: приложение начало TLS-рукопожатие, не приняло сертификат и ушло. Полная инструкция по настройке: Мобильные устройства.
Рядом
- Android не доверяет сертификату проксиПриложения под Android 7+ игнорируют пользовательские сертификаты. Как разрешить их отладочной сборке через network_security_config и чего это не починит.
- Как посмотреть трафик с iPhone или Android — пошаговоТелефон и компьютер в одной сети Wi-Fi, прокси в настройках сети, корневой сертификат с полным доверием. Четыре шага и шесть причин, по которым они не срабатывают.