我正在尝试学习如何使用NSURLSession
处理身份验证质询。我以前从未做过任何与安全网络有关的事情。我一直在阅读Apple NSURLSession Programming Guide
中的Authentication Challenges and TLS Chain Validation部分,并且在那里提到了对象NSURLCredentialStorage
,但在其参考中我没有进一步描述我为什么要使用它。
NSURLCredentialStorage
和Keychain
之间有什么区别?他们最安全地处理用户名和密码应该是什么?我正在寻找NSURLSession
以及NSURLCredentialStorage
和Keychain
的身份验证质询示例但没有成功,有人可以告诉我在哪里可以找到它吗?
提前致谢
答案 0 :(得分:1)
如果您不想为服务器信任或客户端SSL(很少使用)进行自己的身份验证,则可以忽略与SSL身份验证回调相关的委托回调,而系统将使用默认证书链您的密钥链来验证请求。
如果您想进行自己的身份验证,例如验证服务器信任是否正确以及是否要进行证书固定,那么您可以覆盖didReceiveChallenge
委托回调并明确检查服务器信任。
要进行证书固定,请参阅https://gist.github.com/mdelete/d9dbc320d5de347c2a85
如果您只想进行正常的服务器信任检查,假设服务器具有由作为系统一部分的可信CA颁发的证书,则可以使用此信息。
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];
}