2010-09-20 7 views
1

Я запрашиваю некоторые данные с сервера с NSString#stringWithContentsOfURL:. Сервер использует самозаверяющий сертификат, поэтому stringWithContentsOfURL: просто возвращает ноль и не дает изменений, чтобы принять сертификат.Самоподписанные сертификаты SSL и stringWithContentsOfURL

Это все ожидаемое поведение. Я знаю, как правильно это делать с помощью NSURLConnection и вместо этого это методы делегата, но я ищу вместо этого более короткое исправление, а не переписывание этого кода. (Yay крайние сроки)

Итак, мой вопрос: можно ли импортировать самозаверяющий сертификат в цепочку ключей приложения, и это приведет к тому, что stringWithContentsOfURL: примет самозаверяющий сертификат?

+0

У меня проблема. Как вы его решили? –

ответ

1

Я полагаю, что для установки сертификатов SSL есть корпоративный инструмент от Apple, необходимо было получить обменную почту.

Возможно, вы также сможете отправить файл .cer самому себе, открыть его на своем iPhone и установить его.

Существует также AdvancedURLConnections sample project от компании Apple

Этот пример демонстрирует различные передовые технологии сетей с NSURLConnection. В частности, он демонстрирует, как реагировать на вызовы аутентификации, как модифицируют оценки на сервер по умолчанию доверия (например, для поддержки сервера с собственной подписью сертификата), и как обеспечить клиент идентичностей.

1

Невозможно обойти эту схему проверки SSL, и через некоторое время попробовать и искать повсюду для решения, мне пришлось реализовать класс, чтобы сделать именно это.

Поскольку преимущество NSString в stringWithContentsOfURL должно быть синхронным, я должен был убедиться, что мой был также. Это, вероятно, немного большая для всех целей, но вы получаете суть этого.

@interface NZStringLoader : NSObject 
@property (assign, readonly, nonatomic) BOOL done; 
@property (strong, readonly, nonatomic) NSString *result; 
@property (strong, readonly, nonatomic) NSURLConnection *conn; 

- (id) initWithURL:(NSURL*)u; 
- (void) loadSynchronously; 

@end 

@implementation NZStringLoader 

@synthesize done = _done, result = _result, conn = _connection; 

- (id) initWithURL:(NSURL*)u { 
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:u 
               cachePolicy:NSURLRequestReloadIgnoringCacheData 
              timeoutInterval:10.0]; 
    _connection = [NSURLConnection connectionWithRequest:req delegate:self]; 
    _done = NO; 

    return self; 
} 

- (void) loadSynchronously { 
    [_connection start]; 

    while(!_done) 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.15]]; 
} 

#pragma mark - 
#pragma mark NSURLConnectionDelegate 

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    _done = YES; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    RTLog(@"%@", [error localizedDescription]); 
    _done = YES; 
} 

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

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    if(_result == nil) 
     _result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    else 
     _result = [_result stringByAppendingString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]]; 
} 

@end 

И он используется так:

NZStringLoader *sl = [[NSStringLoader alloc] initWithURL:u]; 
    [sl loadSynchronously]; 
    result = sl.result; 

Я предполагаю, что я мог сделать это только один вызов, если бы я хотел.

Смежные вопросы