AuthenticationMethodServerTrust равен нулю в iOS 9
Я пытался реализовать способ закрепления открытого ключа в приложении iOS 8+ с помощью NSURLSession.
Что я делаю, так это просто реализую метод делегата didReceiveChallenge и получаю challenge.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)
}
}
1 ответ
Ваш обратный вызов может быть вызван несколько раз для разных областей защиты. Здесь происходит то, что порядок этих вызовов изменился, и вызов пространства для защиты доверия сервера, очевидно, не происходит первым по какой-то причине в iOS 9.
Проблема в том, что вы отменяете первый вызов, который фактически разрывает соединение. Не делай этого. Вместо этого используйте "выполнить обработку по умолчанию".
Вы также, вероятно , не хотите выполнять обработку по умолчанию для случая доверия сервера, потому что это равносильно тому, что вообще не пишете пользовательский обработчик. Вместо этого проверьте ключ и выполните обработку по умолчанию, только если это тот ключ, который вам нужен, иначе отмените запрос аутентификации.
Или, может быть, я неправильно читаю ваш код. Похоже, что какой-то код отсутствует. Может случиться так, что вы вообще не обрабатываете случай отсутствия доверия к серверу, и в этом случае это проблема. Если вы не вызываете что-то для каждого вызова, соединение просто будет оставаться там вечно, ожидая, что вы это сделаете.