Как получить значение 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)) } } } 

Вы всегда можете переместить 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)) 
  • Как заставить центральную ячейку UICollectionView перекрывать две другие ячейки, расположенные сбоку?
  • Strange SpriteKit для ошибки цикла
  • Пользовательский подкласс UIView с XIB в Swift
  • Полилинии, не отображаемые на картах Google
  • Неверный пользовательский вид - self.frame?
  • UITableViewAutomaticDimension, применяемое к ячейке представления таблицы субтитров, не работает должным образом
  • Преобразование NSDate в строку в iOS Swift
  • Как добавить UIView в UIWebView?
  • Какой из них лучше определять пользователей в быстром управлении памятью? Enum, Struct или класс в swift?
  • Каков наиболее эффективный способ хранения (сохранения) массива структуры до истечения срока действия приложения?
  • iOS - виджет расширения для домена со временем
  • Давайте будем гением компьютера.