Я разработал приложение в Xcode10 с помощью Swift (название приложения: «TerminalsPOC»).Я делаю запрос https для внутреннего веб-API моей организации (давайте назовем URL "https://example.com:50001/RESTAdapter/toolbox/getMyData"), используя Alamofire. У меня есть класс с переменной уровня класса для ссылки на менеджер сеанса:
// Swift code
let serverTrustPolicies: [String: ServerTrustPolicy] = [
“example.com": .pinCertificates(
certificates: ServerTrustPolicy.certificates(in: Bundle(for: type(of: self))),
validateCertificateChain: false,
validateHost: true
)
]
sessionManager = SessionManager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
sessionManager.request(url, method: .get) ...
Я импортировал необходимый сертификат .cer в комплект приложения. Я оставил настройки ATS по умолчанию, но добавил NSExceptionDomain. Соответствующий раздел info.plist выглядит как
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<false/>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
Это работает так долготак как для параметра NSExceptionAllowsInsecureHTTPLoads установлено значение true. Если задано значение false, запрос завершается ошибкой с сообщением: произошла ошибка SSL и невозможно установить безопасное соединение с сервером. [-1200]
2018-12-07 11: 55: 42.122423-0700 TerminalsPOC [27191: 371810] Сбой системы ATS. Доверие системы 2018-12-07 11: 55: 42.122530-0700 TerminalsPOC [27191: 371810] Сбой системы доверия для [2: 0x600001fad740]
2018-12-07 11: 55: 42.122637-0700 TerminalsPOC [27191: 371810] Ошибка доверия SSL TIC [2: 0x600001fad740]: 3: 0
2018-12-07 11: 55: 42.125928-0700 TerminalsPOC [27191: 371810] Ошибка загрузки HTTP NSURLSession / NSURLConnection (kCFStreamErrorDomainSSL, -9802)
2018-12-07 11: 55: 42.126109-0700 TerminalsPOC [27191: 371810] Задача <54567B-4227-9C0A-FC60370A10AA>. <1> Ошибка загрузки HTTP (код ошибки: -1200 [3: -9802])
2018-12-07 11: 55: 42.126872-0700 TerminalsPOC [27191: 371812] Задание <54567E3C-2BBC-4227-9C0A-FC60370A10AA>. <1> завершено с ошибкой - код: -1200
2018-12-07 11: 55: 42.140600-0700 TerminalsPOC [27191: 371810] Задача<54567E3C-2BBC-4227-9C0A-FC60370A10AA>. <1> Сбой загрузки с ошибкой Ошибка Domain = NSURLErrorDomain Code = -1200 "Произошла ошибка SSL и не удалось установить безопасное соединение с сервером." UserInfo = {NSLocalizedRecoverySuggestion =В любом случае вы хотите подключиться к серверу?0024e89f0 {Ошибка домена = kCFErrorDomainCFNetwork код = -1200 "(нуль)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0, = kCFStreamPropertySSLPeerTrust, _kCFNetworkCFStreamSSLErrorOriginalValue = -9802, _kCFStreamErrorDomainKey = 3, _kCFStreamErrorCodeKey = -9802, kCFStreamPropertySSLPeerCertificates = ( "", "")}}, _NSURLErrorRelatedURLSessionTaskErrorKey = ( "LocalDataTask <54567E3C-2BBC-4227-9C0A-FC60370A10AA>. <1>"), _kCFStreamErrorCodeKey = -9802, _NSURLErrorFailingURLSessionTaskErrorKey = LocalDataTask <54567E3C-2BBC-4227-9C0A-FC60370A10AA>. <1>, NSURLErrorFailingURLPeerTrustErrorKey =, NSLocalizedDescription = Произошла ошибка SSL, и невозможно установить безопасное соединение с сервером.} [-1200]
Я попытался запустить «nscurl --ats -одиагностика https://example.com:50001/RESTAdapter/toolbox/getMyData”, иответ включал следующее:
Безопасное соединение ATS по умолчанию
--- Результат соединения ATS по умолчанию: PASS
========
Разрешение произвольных нагрузок
--- Разрешить All Результат загрузки: PASS
========= Настройка исключений TLS для example.com
--- TLSv1.3 2018-12-07 10: 59: 17.492 nscurl[24303: 331847] Ошибка загрузки HTTP NSURLSession / NSURLConnection
(kCFStreamErrorDomainSSL, -9800) Результат: FAIL
--- TLSv1.2 Результат: PASS
---TLSv1.1 Результат: PASS
--- TLSv1.0 Результат: PASS
=========== Настройка исключений PFS для example.com
--- Отключение Perfect Forward Secrecy Результат: PASS
========== Настройка исключений PFS и разрешение небезопасного HTTP для example.com
--- Отключение PerfectПрямая секретность и разрешение небезопасного HTTP-результата: PASS
Это все выглядит нормально для меня.Я, должно быть, что-то упускаю.
Итак, мои вопросы:
1. Почему установка NSExceptionAllowsInsecureHTTPLoads в true приводит к тому, что вызов работает,учитывая, что это запрос https (без перенаправления)?Я думал, что этот параметр влияет только на вызовы http и не должен влиять на вызовы https.
2. Как я могу заставить этот веб-запрос работать без установки NSExceptionAllowsInsecureHTTPLoads (который кажется взломанным /обходной путь, не так ли??