NSURLSession "Ошибка загрузки HTTP kCFStreamErrorDomainSSL, -9813; Самозаверяющий сертификат

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

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, я получаю следующую ошибку.

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

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

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

7 ответов

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

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

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

Просто посмотрите на эту ссылку, она также может помочь вам: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

-

Обновление: после некоторых комментариев вышеупомянутое решение больше не работает. Вот обновленное решение.

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

-

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

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

связи

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

Сессия WWDC 2015 года 711

Ошибка соединения HTTP iOS 9 - Stackru

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

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

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

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

Это единственное решение, сработавшее для меня... В конце вашего файла AppDelegate.m вставьте код:

@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end

Спасибо за статью Й.К. Иванцевича http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/

(Правка - я неправильно прочитал это как 9814, сертификат с истекшим сроком действия. Я не уверен, как решить этот вопрос, но, надеюсь, мой ответ поможет указать правильное направление.)

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

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

NSOSStatusErrorDomain errSSLNoRootCert -9813

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

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

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

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

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

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

Другие вопросы по тегам