Как получить значение nonTil ServerTrust при создании URLAuthenticationChallenge программно?

У меня есть код с открытым ключом в моем приложении Swift iOS, который отлично работает.

Я сейчас работаю над блочными модульными тестами, которые будут проверять код пиннинга открытого ключа без необходимости подключения к сети / реального сервера. У меня это почти работает, но я не могу понять, как создать программный URLAuthenticationChallenge, который имеет не-nil serverTrust? В документации Apple указано, что это должно быть не ноль, если ваш метод аутентификации NSURLAuthenticationMethodServerTrust. Я использую файлы p12 и cer, созданные на моей локальной машине, для создания URLCredential в приведенном ниже примере. Независимо от того, что я делаю, challenge.protectionSpace.serverTrust всегда возвращается нуль.

let protectionSpace = URLProtectionSpace(host: "mockSession", port: 0, protocol: "https", realm: nil, authenticationMethod: NSURLAuthenticationMethodServerTrust) var urlCredential:URLCredential? if let p12Data = try? Data(contentsOf: URL(fileURLWithPath: Bundle.init(for: type(of: self)).path(forResource: "cm7justindomnit", ofType: "p12") ?? "")), let cerData = try? Data(contentsOf: URL(fileURLWithPath: Bundle.init(for: type(of: self)).path(forResource: "cm7justindomnit", ofType: "cer") ?? "")){ let options: NSDictionary = [kSecImportExportPassphrase:"password"] var items: CFArray? let _ = SecPKCS12Import(p12Data as CFData, options, &items) if let items = items { let objectsData = Data.init(from: CFArrayGetValueAtIndex(items, 0)) let objects = objectsData.toArray(type: CFDictionary.self).first let secIdentityData = Data.init(from: CFDictionaryGetValue(objects, Unmanaged.passUnretained(kSecImportItemIdentity).toOpaque())) if let secIdentity = secIdentityData.toArray(type: SecIdentity.self).first { if let secCertifiate = SecCertificateCreateWithData(kCFAllocatorDefault, cerData as CFData) { urlCredential = URLCredential(identity: secIdentity, certificates: [secCertifiate], persistence: .forSession) } } } } let challenge = URLAuthenticationChallenge(protectionSpace: protectionSpace, proposedCredential: urlCredential, previousFailureCount: 0, failureResponse: nil, error: nil, sender: self) 

У меня есть расширение Data для обработки UnsafeBufferPointers.

 extension Data { init<T>(from value: T) { var value = value self.init(buffer: UnsafeBufferPointer(start: &value, count: 1)) } func to<T>(type: T.Type) -> T { return self.withUnsafeBytes { $0.pointee } } func toArray<T>(type: T.Type) -> [T] { return self.withUnsafeBytes { [T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.stride)) } } } 

One Solution collect form web for “Как получить значение nonTil ServerTrust при создании URLAuthenticationChallenge программно?”

Вы всегда можете переместить didReceive challenge отдалиться от тестируемого вами класса и связать его с некоторой протокольной связью. Затем просто вызовите его методы, когда это необходимо. Например:

 protocol CheckerProtocol { // or event simplier func isOkCertificate(_ certificate: ) -> Bool } 

Если вам нужно протестировать некоторую логику с помощью сертификата, просто передайте его напрямую на свою проверку:

 if let serverTrust = challenge.protectionSpace.serverTrust { var secresult = SecTrustResultType(kSecTrustResultInvalid) let status = SecTrustEvaluate(serverTrust, &secresult) if status == errSecSuccess { if let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) { if self.checker.isOkCertificate(certificate) { ... } } } } 

Переместить код проверки на

 class Checker: CheckerProtocol { ... } 

В вашей тестовой цели:

 let certificate = // init right/wrong one let checker = Checker() XCTAssert[True|False](checker.isOkCertificate(certificate)) 
  • @IBActions для кнопок отключены при добавлении в код - Swift, Xcode 8
  • Местные уведомления срабатывают немедленно, а не когда они запланированы
  • NSGenericException при добавлении некоторых ограничений программно
  • Swift - создание вертикального UIScrollView программно
  • Как написать плагин cordova в Swift с CocoaPods?
  • Как исправить ошибку ibtool с ошибкой Main.storyboard: shouldBeArchived unrecognized
  • UITableCell не изменяет размер
  • Как иметь несколько размеров ячеек в динамическом tableView в swift?
  • Не удалось использовать Swift для внедрения электронной почты в приложении
  • Как воспроизвести аудио из AVAudioPCMBuffer, преобразованного из NSData
  • как я могу быстро обновить пользовательский интерфейс других контроллеров?
  • Interesting Posts

    Рекомендуемый iOS способ работы с интерфейсами портретной и альбомной ориентации

    Каталог активов Xcode 6 автоматически создает изображения для небольших масштабов

    Почему я получаю несоответствие URI перенаправления при попытке войти в Box?

    Spotify SPTAuth canHandleURL рушится с NSInvalidArgumentException

    Ячейки в UITableView перекрываются. Многие ячейки в одном месте

    Как добавить кнопку в settings.bundle?

    Динамическое изменение размера UICollectionViewCell

    Что делать, если профиль продления срока действия истек, и я хочу обновить приложение?

    Как, если вообще, может ли сопутствующее приложение создавать пропуски с разными логотипами и логотипом?

    NSDateFormatter не дает мне правильный

    dequeueReusableCellWithIdentifier forIndexPath

    Создание архива для выпуска XCode 4.6 с помощью телефонной заставки v 2.9 не выполняется

    Тамильский шрифт в iOS

    Ошибка FB SDK: Ошибка входа (с ошибкой)

    не может быть открыт, потому что файл проекта не может быть проанализирован в ios

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.