Я работаю в приложении iOS. Я пытаюсь подключиться к серверу https с подключением NSStream. С NSURLConnection это работает отлично, и я могу доверять этой задаче:

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {

}

Но моя проблема в том, что единственный доступный в Stream делегат:

- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

} 

Как с этим справиться?

0
thelastworm 9 Апр 2013 в 11:32

1 ответ

Лучший ответ

Наконец-то я нашел решение. Спасибо Wireshark

        [inStream setProperty:(id)kCFBooleanFalse forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];
        [outStream setProperty:(id)kCFBooleanFalse forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];
        NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:1];
        [settings setObject:_certificates forKey:(id)kCFStreamSSLCertificates];
        [settings setObject:(NSString *)NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];
        [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
        [settings setObject:@"MY HOST" forKey:(NSString *)kCFStreamSSLPeerName];

        CFReadStreamSetProperty((CFReadStreamRef)inStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
        CFWriteStreamSetProperty((CFWriteStreamRef)outStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);

Самое главное - установить сертификат без действующего сертификата. Вы должны установить текущий идентификатор и другой сертификат в цепочке. Это должно быть установлено iOSX с использованием Identity, и обычно закрытый ключ будет доступен для потока.

Надеюсь на эту помощь

0
thelastworm 10 Апр 2013 в 12:49