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

Ошибка загрузки 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, он работает абсолютно нормально, как и на всех других тестовых устройствах, которые я использую.

Я читал, что это означает, что сертификат некорректен каким-то образом, если это так, можно ли это игнорировать и почему повлиять на одно устройство?

Кто-нибудь может предположить, почему это может происходить, и что может отличаться от устройства, которое помешает ему работать только на одном из моих устройств. Благодаря

4b9b3361

Ответ 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/...
    • вы можете получить дополнительную информацию в Apple Developer
  • Убедитесь, что вы установили имя домена для сервера вместо IP-адреса.

Ответ 5

У меня такая же проблема при запуске приложения в симуляторе. Причина этого в том, что в симуляторе нет доверенного сертификата.

просто перетащите ваши файлы .cer в окно запуска Simulator. Вы увидите мигание Safari, а затем диалоговое окно импорта для вашего сертификата (или центра сертификации)...