Запрос Alamofire https работает, только если для NSExceptionAllowsInsecureHTTPLoads установлено значение true - PullRequest
0 голосов
/ 07 декабря 2018

Я разработал приложение в 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 (который кажется взломанным /обходной путь, не так ли??

1 Ответ

0 голосов
/ 18 декабря 2018

Проблема в этом случае заключалась в том, что приложение работало на симуляторе, на котором не был установлен требуемый сертификат.

Как только правильный (корневой) сертификат был установлен и доверен, проверка закрепленного сертификата прошла, и тогда стало возможным установить для параметра NSExceptionAllowsInsecureHTTPLoads info.plist значение «NO».

Хотелось бы, чтобы сообщение об ошибке было более явным.: - /

...