Подтвердить что ты не робот

Установленные сертификаты iOS 11, 12 и 13 не являются доверенными автоматически (самозаверяющий)

В нашей внутренней сети мы используем самозаверяющий сертификат ЦС. Это отлично работает в течение многих лет, как в Safari, так и в нашем продукте iOS, через iOS 10. Мы просто устанавливаем сертификат CA на любом новом устройстве или симуляторе, и все работает даже с ATS. Это позволяет получить доступ ко всем нашим внутренним тестовым серверам без необходимости доверять каждому серверу индивидуально.

Начиная с iOS 11 установленный сертификат CA больше не позволяет Safari или нашему приложению доверять сертификату для любого из серверов. Мы получаем следующие релевантные сведения с CFNETWORK_DIAGNOSTICS для нашего приложения:

Ошибка домена = kCFErrorDomainCFNetwork Code = -1200
_kCFNetworkCFStreamSSLErrorOriginalValue = -9802
_kCFStreamErrorDomainKey = 3
_kCFStreamErrorCodeKey = -9802
NSLocalizedDescription = Произошла ошибка SSL, и безопасное подключение к серверу невозможно.
NSLocalizedRecoverySuggestion = Хотелось бы все-таки подключиться к серверу?

Я потратил немало времени, пытаясь решить эту проблему, очищая StackOverflow и остальную часть Интернета. Хотя мы используем AFNetworking в нашем приложении, это кажется неуместным, так как Safari больше не доверяет этим серверам через CA. Отключение ATS через NSAllowsArbitraryLoads обеспечивает доступ к серверам, но, очевидно, не является решением.

Мы не внесли никаких изменений в наш код -URLSession:didReceiveChallenge:completionHandler, и у нас есть правильная (работающая в течение многих лет) реализация ответа на вызов через challenge.protectionSpace.serverTrust.

Я переоценил и тестировал как сертификаты CA, так и серверные сертификаты каждый раз, о чем я могу думать, и они работают повсюду, кроме iOS 11. Что может измениться в ATS для iOS 11, что может вызвать эту проблему?

4b9b3361

Ответ 1

При написании этого вопроса я обнаружил ответ. Установка CA от Safari больше не доверяет ему автоматически. Мне пришлось вручную доверять ему из панели "Настройки доверия сертификатов" (также упоминавшейся в этом вопросе).

enter image description here

Я обсуждал вопрос об отмене вопроса, но подумал, что может быть полезно иметь некоторые соответствующие коды и подробности журнала, которые кто-то может искать. Кроме того, я никогда не сталкивался с проблемой до iOS 11. Я даже вернулся и подтвердил, что она автоматически работает через iOS 10.

Мне никогда не приходилось трогать эту панель настроек раньше, потому что все установленные сертификаты автоматически доверялись. Возможно, это изменится к тому времени, когда выйдет iOS 11, но я сомневаюсь в этом. Надеюсь, это поможет кому-то сэкономить время, которое я потратил впустую.

Если кто-то знает, почему это происходит по-разному для некоторых людей на разных версиях iOS, я хотел бы узнать это в комментариях.

Обновление 1: проверяя первую бета-версию iOS 12, похоже, что все осталось по-прежнему. Этот вопрос/ответ/комментарии по-прежнему актуальны для iOS 12.

Обновление 2: Похоже, что такое же решение необходимо и для бета-версий iOS 13.

Ответ 2

Рекомендуемое решение - установить и доверять самоподписанному сертификату (root). Предполагая, что вы создали свой собственный центр сертификации, и иерархия сертифицированных верна, вам не нужно менять оценку доверия сервера. Это рекомендуется, потому что это не требует каких-либо изменений в коде.

  1. Сгенерируйте CA и сертификаты (вы можете использовать openssl: Генерация CA и самозаверяющих сертификатов.
  2. Установите корневой сертификат (файл *.cer) на устройстве - вы можете открыть его с помощью Safari, и он должен перенаправить вас в Настройки
  3. После установки сертификата перейдите в Настройки доверия сертификатам (Настройки> Общие> О программе> Настройки доверия сертификата), как в ответе MattP.

Если это невозможно, вам нужно изменить оценку доверия сервера.

Более подробная информация в этом документе: Технические вопросы и ответы QA1948 HTTPS и тестовые серверы

Ответ 3

Это случилось и со мной, после того, как я отключил IOS11 на своем iPhone. Когда я пытаюсь подключиться к корпоративной сети, он вызывает корпоративный сертификат и говорит, что ему не доверяют. Я нажимаю кнопку "доверие", и соединение терпит неудачу, и сертификат не отображается в списке доверенных сертификатов.

Ответ 4

Apple вручит три категории сертификатов: Trusted, Always Ask и Blocked. Вы столкнетесь с проблемой, если ваш тип сертификата в списке Blocked и Always Ask. В Safari это выглядит так: введите описание изображения здесь

И вы можете найти тип сертификатов Always Ask в разделе "Настройки" > "Основные" > "О программе" > "Настройка доверия к сертификату"

Существует Список доступных доверенных корневых сертификатов в iOS 11

Блокирование доверия для WoSign CA Бесплатный сертификат SSL G2

Ответ 5

Если вы не видите сертификат в General-> About-> Certificate Trust Settings, то, вероятно, у вас не установлен ROOT CA. Очень важно - должен быть ROOT CA, а не посредник CA.

Я только что ответил на вопрос, объясняющий, как получить ROOT CA и как его показать: как установить самоподписанные сертификаты в iOS 11

Ответ 6

Я боролся с этим уже 3 дня, пытаясь подключиться к локальному API, на котором работает Laravel valet. Я наконец-то понял. В моем случае мне пришлось перетащить файл LaravelValetCASelfSigned.pem из ~/.config/valet/CA/LaravelValetCASelfSigned.pem

После проверки установки в симуляторе мне нужно было зайти в "Настройки"> "О программе"> "Настройки доверия сертификатам"> и включить "Laravel Valet VA Self Signed CN".

Наконец-то работает !!!