Проверка подлинности с NSURLSession: NSURLCredentialStorage vs Keychain
Я пытаюсь узнать, как бороться с проблемой аутентификации, используя NSURLSession
, Я никогда раньше не делал ничего, связанного с безопасными сетями. Я читал раздел " Проблемы проверки подлинности и проверки цепочки TLS " в Apple. NSURLSession Programming Guide
и там объект NSURLCredentialStorage
упоминается, но в его ссылке я не получаю дальнейшего описания того, почему я должен его использовать.
В чем разница между NSURLCredentialStorage
и Keychain
? Что должно быть лучшим из них для безопасной обработки имени пользователя и паролей? Я ищу пример проверки подлинности с NSURLSession
и либо NSURLCredentialStorage
а также Keychain
безуспешно, может кто-нибудь сказать мне, где я могу найти один?
заранее спасибо
1 ответ
Если вы не хотите выполнять собственную аутентификацию для доверия сервера или клиентского SSL (редко используется), вы можете игнорировать обратные вызовы делегатов, связанные с обратными вызовами аутентификации SSL, и вместо этого система будет использовать цепочки сертификатов по умолчанию в цепочке для ключей для аутентификации запрос.
Если вы хотите выполнить свою собственную аутентификацию, такую как проверка правильности доверия к серверу, и если вы хотите закрепить сертификат, то вы можете переопределить didReceiveChallenge
делегировать обратный вызов и явно проверить доверие к серверу.
Чтобы прикрепить сертификат, обратитесь к https://gist.github.com/mdelete/d9dbc320d5de347c2a85
Если вы хотите просто выполнить обычную проверку доверия сервера, предполагая, что на сервере есть сертификат, выданный доверенным центром сертификации, который является частью Системы, вы можете использовать это.
OSStatus err = noErr;
BOOL trusted = NO;
NSURLProtectionSpace * protectionSpace = challenge.protectionSpace;
SecTrustRef serverTrustRef = protectionSpace.serverTrust;
SecTrustResultType trustResult;
//check if the server trust that we got from the server can be trusted by default
err = SecTrustEvaluate(serverTrustRef, &trustResult);
trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultUnspecified));
if (trusted)
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
else //if not then warn the user about this and let the user make a decision
{
//Cancel conneciton
[challenge.sender cancelAuthenticationChallenge:challenge];
}