Подтвердить что ты не робот

NSURLSession "Ошибка загрузки HTTP kCFStreamErrorDomainSSL, -9813; Сертификат самоподписывания

Я пытаюсь подключить свое приложение iOS к приложению HTTPS Rails, которое в настоящее время выполняется на локальном хосте в моей сети. Я могу получить доступ к сайту из своего браузера с помощью https://myIP:3000/display, а также в командной строке с запросом на завивание. Я пытаюсь получить к нему доступ из моего приложения, используя:

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //let url = NSURL(string: "https://another/Sinatra/website/feed")
        let url = NSURL(string: "https://myIP:3000/display")

        let request = NSURLRequest(URL: url!)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
        task!.resume()
    }

Когда я пытаюсь получить доступ к сайту sinatra, у меня нет проблем и вы можете даже распечатать JSON на консоли с правильными командами. Однако, когда я устанавливаю URL-адрес моего веб-сайта Rails, я получаю следующую ошибку.

NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9813)

Кроме того, я могу сказать, что мое приложение localhost Rails (на другом компьютере) не пингируется из приложения iOS, а пинг из команды браузера и curl.

Любые идеи, как это исправить?

4b9b3361

Ответ 1

Если я хорошо понял, Apple теперь хочет, чтобы разработчики использовали HTTPS и TLS 1.2 для сетевых вызовов.

Временный, вы можете добавить это в свой файл "Info.plist":

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Просто взгляните на эту ссылку, она также может помочь вам: http://ste.vn/2015/06/10/configuring-app- транспортно-безопасности-ИОС-9-OSX-10-11/

-

Обновление. Следуя некоторым комментариям, вышеупомянутое решение больше не работает. Вот обновленное решение.

  • Перейдите в свой Info.plist файл.
  • Добавьте строку типа Dictionary и ключа App Transport Security Settings.
  • В этом словаре добавьте строку типа Boolean, ключа Allow Arbitrary Loads и значения YES

-

В противном случае вы можете установить Domain Exceptions. Вот как это сделать:

  • Перейдите в свой Info.plist файл.
  • Добавьте строку типа Dictionary и ключа App Transport Security Settings.
  • Добавьте строку типа Dictionary и ключа Exception Domains.
  • Добавьте строку типа Dictionary и ключа The domain.
  • Добавьте две строки типа Boolean и ключа NSExceptionAllowsInsecureHTTPLoads и NSIncludesSubdomains со значением до YES.

Ссылки

https://forums.developer.apple.com/message/5857#5857

2015 WWDC Session 711

fooobar.com/questions/137233/...

Ответ 2

Это проблема доверия. С самозаверяющим сертификатом компонент проверки подлинности SSL не работает. По-прежнему можно установить безопасное соединение, чтобы никто не подслушивал, но приложение не может быть уверенным, кто находится на другом конце строки.

У меня аналогичная настройка, и я решил эту проблему, добавив свой самозаверяющий корневой центр сертификации в доверенные сертификаты iPad. Этот корневой ЦС используется для подписания всех моих других сертификатов разработки. Тогда мне просто нужно добавить этот единственный корневой сертификат в любом месте, где будет использоваться SSL. Если у вас есть только самозаверяющий сертификат, который вы используете напрямую, вы можете просто добавить это.

Чтобы получить сертификат на устройстве (или симуляторе), я помещаю файл на свой веб-сервер. Затем просто откройте его в Safari через простой HTTP. Приложение "Настройки" должно открыть и спросить, хотите ли вы доверять сертификату.

Конечно, предполагается, что это только для разработки, и что ваша производственная система имеет сертификат, подписанный известным авторитетом (т.е. включенным в базу данных ОС корневых центров сертификации). Потому что просить конечных пользователей установить ваш самозаверяющий сертификат не будет летать.

Ответ 3

(Edit - я неправильно понял это как 9814, истекший cert. Я не уверен, как решить эту проблему, но, надеюсь, мой ответ помогает указать в правильном направлении.)

Похоже, проблема с сертификатом отличается от обычного вопроса "Разрешить произвольные нагрузки".

Краткая выдержка из: Документация Apple - Приложение A: Ошибки общего доверия к серверу

NSOSStatusErrorDomain errSSLNoRootCert -9813

Ответ 4

попробуйте изменить переменную сеанса, это изменение поможет мне

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

Ответ 6

Модификация info.plist тоже работала для меня.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Ответ 7

NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9813)

Добавьте новую строку в ваш файл plist. введите описание изображения здесь