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-рукопожатие, не приняло сертификат и ушло. Полная инструкция по настройке: Мобильные устройства.

Посмотреть в Solpuga

Рядом