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/
-
Обновление: после некоторых комментариев вышеупомянутое решение больше не работает. Вот обновленное решение.
- Перейти к вашей
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
,
связи
Это вопрос доверия. С самозаверяющим сертификатом компонент проверки подлинности 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)