2016-01-05 5 views
4

Я создаю приложение iPad, которое обращается к веб-службам HTTPS. Я хочу реализовать пиннинг, но у меня проблемы.Сертификат в Alamofire

Этот класс создает менеджер Alamofire (в основном взят из документации):

class NetworkManager { 

    var manager: Manager? 

    init() { 
     let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
      "www.google.co.uk": .PinCertificates(
       certificates: ServerTrustPolicy.certificatesInBundle(), 
       validateCertificateChain: true, 
       validateHost: true 
      ), 
      "insecure.expired-apis.com": .DisableEvaluation 
     ] 

     manager = Alamofire.Manager(
      configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), 
      serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
     ) 
    } 
} 

Эта функция делает вызов:

static let networkManager = NetworkManager() 

public static func testPinning() { 
    networkManager.manager!.request(.GET, "https://www.google.co.uk").response { response in 
     if response.1 != nil { 
      print("Success") 
      print(response.1) 
      print(response.1?.statusCode) 
     } else { 
      print("Error") 
      print(response.3) 
     } 
    } 
} 

certificate is saved в проекте и показывает под «целью> Построить Фазы > Копировать ресурсы Bundle.

В настоящее время я получаю следующее сообщение об ошибке каждый раз, когда я делаю запрос (от блока еще в testPinning()):

Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://www.google.co.uk/, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://www.google.co.uk/}) 
+1

Какой сертификат вы включили? Вы проверили, что возвращает ServerTrustPolicy.certificatesInBundle() '(т. Е. Если он действительно включает сертификат)? Не удивительно, если бы Google использовала несколько сертификатов для одного домена. – jcaron

+0

'ServerTrustPolicy.certificatesInBundle()' возвращает 0, чего я не понимаю. Есть ли конкретный способ добавления сертификатов .cer в комплект? Что касается Google, это пример сайта для замены того, который я разрабатываю, но проблема выше. –

+0

Вы имеете в виду, что он возвращает пустой массив? Возвращаемое значение этого вызова должно быть массивом, а не числом. Вы можете попробовать 'NSBundle.mainBundle(). PathsForResourcesOfType (". Cer ", inDirectory: nil)', чтобы увидеть, найден ли файл в комплекте (если это так, то это, вероятно, указывает на проблему с сертификатом содержимое файла). Все, что появляется в журналах, когда вызывается 'ServerTrustPolicy.certificatesInBundle()'? – jcaron

ответ

8

Таким образом, проблема в том, что сертификат был сохранен в неправильном формате.

ServerTrustPolicy.certificatesInBundle() находит все сертификаты в комплекте на основе списка расширений, затем пытается загрузить их с помощью SecCertificateCreateWithData. За документацией, эта функция:

Возвращает NULL, если данные, передаваемые в параметре данных не является допустимым DER-закодированные X.509 сертификат

При экспорте сертификата в Firefox, вы появится всплывающее окно «format» в нижней части браузера файлов. Выберите «X.509 Certificate (DER)», и вы должны получить сертификат в нужном формате для этой цели.