0

我想在自定义 iOS 6 应用程序中使用 HTTPS 访问一些网络资源。一些目标服务器正在使用由 CA 签名的证书,该证书默认情况下不包含在 iOS 中,而是手动添加到设备的钥匙串中。因此,所有 URL 都可以在 Safari 中打开而不会出现任何警告或错误。

我想要实现的行为与 Safari 相同:如果 Safari 信任它们,我想加载网站,或者在出现任何错误时拒绝加载它们。由于安装的证书可能会因情况而异,我不想在应用程序资源中手动包含任何证书,这是 SO 的许多问题所在。

我的问题是我无法SecTrustEvaluate返回kSecTrustResultProceed。你知道我能做什么吗?

如果我canAuthenticateAgainstProtectionSpace返回NO,iOS 会自行处理服务器证书检查,但它似乎不会检查额外安装的证书(就像 Safari 那样)。

这是一些尝试了解我到目前为止所获得的代码的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self loadURLWithString:@"https://myserver.com"];
}

+ (BOOL) isChallenge: (NSURLAuthenticationChallenge*) challenge validForConnection: (NSURLConnection*)conn{
    SecTrustRef serverTrust=[[challenge protectionSpace] serverTrust];

    //Some magic here?

    // Check Server Certificate
    SecTrustResultType evalResult;
    if(SecTrustEvaluate(serverTrust,&evalResult) != errSecSuccess){
        NSLog(@"Call to SecTrustEvaluate failed");
        return NO;
    }
    if(evalResult != kSecTrustResultProceed){
        NSLog(@"Server certificate invalid");
        return NO;
    }
    NSLog(@"Server certificate valid");
    return YES;
}

- (void)loadURLWithString: (NSString*)str{
    NSURLConnection *conn =
        [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]] delegate:self];
    [conn start];
}


- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
    if([[self class] isChallenge:challenge validForConnection:connection])
        [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
    else
        [challenge.sender cancelAuthenticationChallenge:challenge];
}

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"Failed with error: %@",error);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"loading complete");
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

}
4

1 回答 1

1

你试图做的事情是不允许的。有关更多信息,请参阅 Apple 开发者论坛中的此主题:

https://devforums.apple.com/message/660579#660579

于 2014-04-15T14:42:31.470 回答