Установленные сертификаты 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, что может вызвать эту проблему?
Ответы
Ответ 1
При написании этого вопроса я обнаружил ответ. Установка CA от Safari больше не доверяет ему автоматически. Мне пришлось вручную доверять ему из панели "Настройки доверия сертификатов" (также упоминавшейся в этом вопросе).
![enter image description here]()
Я обсуждал вопрос об отмене вопроса, но подумал, что может быть полезно иметь некоторые соответствующие коды и подробности журнала, которые кто-то может искать. Кроме того, я никогда не сталкивался с проблемой до iOS 11. Я даже вернулся и подтвердил, что она автоматически работает через iOS 10.
Мне никогда не приходилось трогать эту панель настроек раньше, потому что все установленные сертификаты автоматически доверялись. Возможно, это изменится к тому времени, когда выйдет iOS 11, но я сомневаюсь в этом. Надеюсь, это поможет кому-то сэкономить время, которое я потратил впустую.
Если кто-то знает, почему это происходит по-разному для некоторых людей на разных версиях iOS, я хотел бы узнать это в комментариях.
Обновление 1: проверяя первую бета-версию iOS 12, похоже, что все осталось по-прежнему. Этот вопрос/ответ/комментарии по-прежнему актуальны для iOS 12.
Обновление 2: Похоже, что такое же решение необходимо и для бета-версий iOS 13.
Ответ 2
Рекомендуемое решение - установить и доверять самоподписанному сертификату (root). Предполагая, что вы создали свой собственный центр сертификации, и иерархия сертифицированных верна, вам не нужно менять оценку доверия сервера. Это рекомендуется, потому что это не требует каких-либо изменений в коде.
- Сгенерируйте CA и сертификаты (вы можете использовать openssl: Генерация CA и самозаверяющих сертификатов.
- Установите корневой сертификат (файл *.cer) на устройстве - вы можете открыть его с помощью Safari, и он должен перенаправить вас в Настройки
- После установки сертификата перейдите в Настройки доверия сертификатам (Настройки> Общие> О программе> Настройки доверия сертификата), как в ответе 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".
Наконец-то работает !!!