是NSURLConnection willSendRequestForAuthenticationChallenge安全

时间:2013-10-10 19:35:40

标签: ios ssl nsurlconnection nsurlconnectiondelegate

我在iOS应用中使用HTTPS POST连接到内部公司REST服务。 此服务需要基本的HTTP身份验证。

当我尝试在HTTPHeader中传递身份验证参数时,服务器回复时出现错误,指出“Error Domain = NSURLErrorDomain Code = -1202”此服务器的证书无效。您可能正在连接到假装是“oiam.XXXX.com”的服务器,这可能会使您的机密信息面临风险。“UserInfo = 0x8d1de60 {NSErrorFailingURLStringKey = https://oiam.xxxx.com/NSLocalizedRecoverySuggestion=Would您还想连接到服务器吗? “

我读了一些问题,看起来我需要安装证书。由于我在iOS模拟器上,我无法安装证书。

我尝试使用NSURLConnectionDelegate协议,连接工作

我遇到的唯一问题是我传递用户名密码的方法。它安全吗?为什么我不需要对值进行编码?我正在进行编码,以便在Header中执行HTTPS基本身份验证时传递值。

-(void)connection:(NSURLConnection *)connection       willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge previousFailureCount]) {
   [[challenge sender] cancelAuthenticationChallenge:challenge];
} else {
    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username1"
                                   password:@"password1"                                                     
                                   persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}

1 个答案:

答案 0 :(得分:3)

对于内部使用和测试,您可以使用类扩展覆盖NSURLRequest中的私有API,以便接受无效证书:

#if DEBUG

@interface NSURLRequest (IgnoreSSL)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host;

@end

@implementation NSURLRequest (IgnoreSSL)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    // ignore certificate errors only for this domain
    if ([host hasSuffix:@"oiam.XXXX.com"]) {
        return YES;
    }
    else {
        return NO;
    }
}

@end

#endif 

关于凭证安全性的问题,它们将在通过网络传输之前根据需要进行编码。