Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9813) в приложении Cordova
Я создал приложение iOS с помощью Cordova 3.2 и jQuery mobile 1.3. Я использую jquery ajax для отправки запросов службе RESTfull для получения/обновления информации.
У меня есть несколько тестовых устройств, различных iPhones, с различными версиями iOS. На iPhone 4S, работающем под iOS 7, я получаю следующую ошибку при отправке любого запроса ajax:
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
Это происходит только на этом устройстве, на другом iPhone 4S, также использующем iOS 7, он работает абсолютно нормально, как и на всех других тестовых устройствах, которые я использую.
Я читал, что это означает, что сертификат некорректен каким-то образом, если это так, можно ли это игнорировать и почему повлиять на одно устройство?
Кто-нибудь может предположить, почему это может происходить, и что может отличаться от устройства, которое помешает ему работать только на одном из моих устройств. Благодаря
Ответы
Ответ 1
Если он работает на некоторых устройствах, а не в других, существует некоторая разница в параметрах проверки сертификата для этих устройств. Вот несколько вещей, на которые нужно обратить внимание:
- У счастливых устройств есть какой-то корневой сертификат, которого нет у несчастных устройств? В частности, если они используют разные версии iOS, они могут иметь разные списки доверенных сертификатов. Попытайтесь перейти в "Настройки" > "Основные" > "Оставить" и сравнить номера "Хранилище доверия" в самом низу. Подробнее см. здесь.
- В какой-то момент времени вы вручную принимали промежуточный сертификат (используемый для подписи этого сертификата) на счастливых устройствах? *
- Является ли дата/время неправильным на несчастливом устройстве? Если он установлен после истечения срока действия сертификата или до даты выдачи сертификата, он отклонит его. Я всегда стреляю в ногу с этим!
Если вы получаете доступ к своему URL-адресу конечной точки в браузере на несчастливом устройстве, какая ошибка вам дает? (Обратите внимание: очевидно, что ваш сервер также даст вам некоторую ошибку, потому что вы не запрашиваете правильные заголовки и параметры. Я говорю о Сафари, однако - он должен дать более подробное сообщение о том, что (он думает) неправильно с сертификатом.)
* Отредактировано для исправления чего-то, что я забыл: у вас нет возможности принять листовой сертификат, если вы перейдете на URL-адрес в Safari, у вас есть возможность принимать промежуточные сертификаты, если вы пытаетесь загрузить их напрямую.
Ответ 2
У меня была аналогичная проблема, но в моем случае на всех устройствах это случалось и только во время вызова ajax с https.
Если это ваш случай, добавление ниже кода в конец файла appDelegate.m уменьшит вашу проблему.
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Но я сомневаюсь, что если он работает в других устройствах, решение, которое я дал, может оказаться неэффективным. Но попробуйте.
Ответ 3
Быстрая версия Отметить ответ (взято из здесь):
extension NSURLRequest {
static func allowsAnyHTTPSCertificateForHost(host: String) -> Bool {
return true
}
}
Ответ 4
Xcode 7.3 Swift 2.2
Чтобы заставить это работать, мне пришлось сделать 3 вещи:
- Мне пришлось добавить Chris answer ^ в конец AppDelegate.swift после закрытия} для класса
- затем измените Info.plist, используя этот ответ fooobar.com/questions/1256/...
- Убедитесь, что вы установили имя домена для сервера вместо IP-адреса.
Ответ 5
У меня такая же проблема при запуске приложения в симуляторе. Причина этого в том, что в симуляторе нет доверенного сертификата.
просто перетащите ваши файлы .cer в окно запуска Simulator. Вы увидите мигание Safari, а затем диалоговое окно импорта для вашего сертификата (или центра сертификации)...