2015-11-29 3 views
1

Я пытаюсь реализовать способ фиксации открытого ключа в моем приложении iOS 8+ с использованием NSURLSession.AuthenticationMethodServerTrust - это nil в iOS 9

Что я делаю, просто реализую метод делегата didReceiveChallenge и получаю вызов.protectionSpace.authenticationMethod и проверяем, равно ли оно NSURLAuthenticationMethodServerTrust.

Если он равен NSURLAuthenticationMethodServerTrust, я проверяю сертификат и сравниваю его с моей локальной копией.

Это нормально работает на iOS 8, но на iOS 9 Я не получаю метод аутентификации, равный NSURLAuthenticationMethodServerTrust. Я получаю NSURLAuthenticationMethodClientCertificate, поэтому я не могу получить доступ к свойству challenge.protectionSpace.serverTrust.

Любые идеи?

public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) 
{ 


     if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) 
     { 
      // Verify the identity of the server 
        println("Trusted") 
        return challenge.sender.performDefaultHandlingForAuthenticationChallenge!(challenge) 

     } 
     println("Not trusted") 
     return challenge.sender.cancelAuthenticationChallenge(challenge) 
    } 
} 
+0

Проверьте http://stackoverflow.com/questions/33542003/client-certificate-authentication-in-swift2/34014653#34014653 ссылку. Это может быть полезно. – Karlos

+0

Привет, Карлос, Это не работает для меня. :-(У меня такая же проблема, что и у Виктора. –

ответ

2

Ваш обратный вызов можно вызвать несколько раз для разных защитных пространств. Что происходит в этом случае, так это то, что порядок этих вызовов изменился, и, по-видимому, серверный запрос защитного пространства по умолчанию не происходит по какой-либо причине в iOS 9.

Проблема в том, что вы отменяете первый вызов, который эффективно завершается связь. Не делай этого. Вместо этого используйте «выполнить обработку по умолчанию».

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

Возможно, я неправильно читаю ваш код. Похоже, что отсутствует какой-то код. Возможно, вы вообще не работаете с несерверным случаем, и в этом случае это проблема. Если вы не назовете чем-то для каждой задачи, соединение просто будет сидеть там навсегда, ожидая, что вы это сделаете.

+1

Спасибо @dgatwood. Вы сохранили мой день :) Видимо, это iOS 9 ClientCertificateChallenge вызывается первым, поэтому я просто добавил: ... else if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate) { completeHandler (NSURLSessionAuthChallengeDisposition.PerformDefaultHandling, nil); } –

+0

FYI, что я сказал на самом деле неправильно неправильно. Обработка по умолчанию для доверия с сервером прекрасна. Это говорит о том, чтобы использовать сертификат, не проверяя, что это будет плохо. :-) – dgatwood