В нашей внутренней сети мы используем самозаверяющий сертификат ЦС. Это отлично работает в течение многих лет, как в 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, что может вызвать эту проблему?