iOS 9.3: Произошла ошибка SSL, и безопасное соединение с сервером невозможно сделать

Я получаю следующую ошибку с самоподписанным сертификатом

Ошибка домена = NSURLErrorDomain Code = -1200 «Произошла ошибка SSL, и безопасное подключение к серверу невозможно.

при тестировании веб-сервисов для одного из моих демо-приложений с

  • iOS 9.3
  • XCode 7.3
  • Swift 2.2
  • Alamofire 3.3.0
  • и локальный сервер: https://filename.hostname.net

Примечание: перед тем, как приступить к его Duplicate, я бы попросил, пожалуйста, прочитать его полностью, даже тот же, что я сообщил в Apple Dev форумы

Использование библиотеки Alamofire


func testAlamofireGETRequest() -> Void { Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john") .responseJSON { response in print("Response JSON: \(response.result.value)") } } 

Использование NSURLSession


 func testNSURLSessionRequest() -> Void { let session = NSURLSession.sharedSession() let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john" let url = NSURL(string: urlString) let request = NSURLRequest(URL: url!) let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in print("done, error: \(error)") //Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made. } dataTask.resume() } 

Я провел 2 дня без везения 🙁

есть куча вопросов, уже отправленных, но ничего не работало для меня

  • Безопасность транспорта заблокировала простой текст HTTP
  • iOS9 получение ошибки "произошла ошибка ssl, и безопасное соединение с сервером невозможно сделать"
  • Как загрузить URL-адрес HTTP с защитой транспорта приложений, включенной в iOS 9? [дубликат]
  • CFNetwork SSLHandshake не удалось iOS 9
  • Как обращаться с «CFNetwork SSLHandshake failed» в iOS
  • Выполнение запроса HTTPS в iOS 9 с самозаверяющим сертификатом
  • Самостоятельный сертификат ios9 и безопасность на транспорте приложений

опубликован вопрос о выпуске Alamofire git

  • Ошибка CFNetwork SSLHandshake (-9847) при выполнении запроса без SSL # 538
  • Самоподписанный сертификат не принимается # 876
  • как я могу подключить свой сервер к HTTPS с использованием самоподписанного файла сертификата # 977

Мой файл Info.pist обновляется для настроек ATS таким образом

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>filename.hostname.net</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 

Тем временем я могу получить ответ

http : //filename.hostname.net

и https : //google.com

но не для https : //filename.hostname.net

Кто-нибудь может предложить мне, почему я не могу получить эту работу после огромных усилий?

Я предполагаю, что сервер, который вы пытаетесь подключить, имеет недопустимые сертификаты или не соответствует стандартам iOS 9 для ECC, Ciphers и т. Д.

  • Если вы используете высокоуровневые сетевые API-NSURLSession, NSURLConnection или что-либо, накладываемое поверх них, вы не имеете прямого контроля над наборами cypher, предлагаемыми клиентом. Эти API выбирают набор наборов cypher, используя собственную внутреннюю логику.

  • Если вы используете сетевые API нижнего уровня – CFSocketStream, через свои API-интерфейсы NSStream и CFStream, и все, что ниже этого, вы можете явно выбрать набор наборов cypher, которые вы хотите использовать. Как вы это делаете, зависит от конкретного API.

Стандартная практика:

  1. создать пару потоков

  2. настроить его для TLS

  3. получить контекст Secure Transport с помощью свойства kCFStreamPropertySSLContext

  4. настроить определенные свойства в этом контексте

  5. открыть потоки

Вы можете увидеть пример этого в примере кода TLSTool. В частности, посмотрите на класс TLSToolServer , где вы можете точно увидеть эту последовательность.

В очень коротком контексте вы хотите настроить поток таким образом, чтобы он обходил безопасность, однако в случае с Alamofire вы можете сделать это напрямую:

 func bypassAuthentication() { let manager = Alamofire.Manager.sharedInstance manager.delegate.sessionDidReceiveChallenge = { session, challenge in var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling var credential: NSURLCredential? if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { disposition = NSURLSessionAuthChallengeDisposition.UseCredential credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) } else { if challenge.previousFailureCount > 0 { disposition = .CancelAuthenticationChallenge } else { credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) if credential != nil { disposition = .UseCredential } } } return (disposition, credential) } } 

дайте мне знать, если это поможет. Спасибо!

В командной строке в OS X запустите следующее:

nscurl --ats-diagnostics https://filename.hostname.net --verbose

Это скажет вам, какие комбинации параметров ATS будут и не позволят iOS получить доступ к вашему сайту и указать на то, что не так с вашим сайтом.

Это может быть один или несколько из следующих

  • Алгоритм хеширования сертификатов (должен быть SHA-256 или выше)
  • Версия TLS (должна быть 1,2)
  • TLS (должны обеспечивать Perfect Forward Secrecy)

Apple выпустила полный список требований для безопасности приложений на транспорте.

Оказалось, что мы работаем с TLS v1.2, но упускаем некоторые из других требований.

Вот полный список проверок :

  • TLS требует, по крайней мере, версии 1.2.
  • Шифры подключения ограничены теми, которые обеспечивают прямую секретность (см. Ниже список шифров).
  • Сервису требуется сертификат с использованием, по меньшей мере, отпечатка SHA256 с ключом RSA 2048 бит или более, или с 256-битной или более эллиптической кривой (ECC).
  • Недействительные сертификаты приводят к жесткому сбою и отсутствию соединения.
  • Принятые шифры: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

У меня был такой же сценарий и застрял на один день. Попробуйте использовать свои мобильные данные, если это хорошо работает с вашим API, а затем проблема с сетевым брандмауэром. затем включите SSL / TLS из настроек брандмауэра.

  • Перемещение вида с помощью клавиатуры с помощью Swift
  • В моем представленииDidAppear, откуда я знаю, когда ребенок разматывается?
  • Внедрение коллекции в виде контейнера - дополнительное белое пространство наверху
  • Как переключаться между несколькими учетными записями пользователей
  • Невозможно войти в систему как другой пользователь после выхода из приложения iOS
  • Как установить максимальное время UIDatePickerModeCountDownTimer?
  • Установите начальное значение элемента выбора даты с использованием основных данных
  • Ошибка приложения при использовании Firebase Auth, причина: «Приложение по умолчанию уже настроено».
  • Проблемы с заголовком камеры с отображением карты
  • UIDocumentPickerViewController - настройка цвета панели навигации
  • Могу ли я оживить изображение iOS8 LaunchScreen.xib
  • Interesting Posts

    iOS5: Исключение в UIWebView в модальном UIViewController, воспроизводящем видео Youtube

    как скрыть пустые строки в UITableView и изменить высоту Uitableview на основе непустых строк

    Swift 3: загрузка фотографий из фото / ролика камеры без использования UIImagePickerController

    Изменение кадра контроллера MGSplitView

    Изменение цвета текста заголовка панели навигации, когда для параметра «prefersLargeTitles» установлено значение true

    CocoaLibSpotify сбрасывает офлайн-доступные треки в SP_TRACK_OFFLINE_WAITING во время входа в систему

    NSFileManager Attributesforitem не работает и возвращает null

    UITableView нажмите и удерживайте + перетаскивание

    конвертировать NSString в NSAttributedString без инициализации alloc

    Почему / когда нам нужно вызвать super.ViewDidLoad?

    Выбор строки, когда UITableView находится в режиме редактирования

    React-Native Offline Bundle – изображения, не показывающие

    Как просто получить список контактов в iOS7?

    UIDatePicker с кнопкой «done»

    Apple Watch – предварительная сборка, чтобы изменить раскладку customModule

    Давайте будем гением компьютера.