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.
Любые идеи, как это исправить?
Ответы
Ответ 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)
Ответ 5
Это единственное решение для меня... В конце вашего файла AppDelegate.m вставьте код:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Спасибо за статью jc ivancevich http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
Ответ 6
Модификация info.plist тоже работала для меня.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Ответ 7
NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9813)
Добавьте новую строку в ваш файл plist. ![введите описание изображения здесь]()