Проверка подлинности с 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];

}
Другие вопросы по тегам