Добавить SSL для синхронизации приложений iOS - PullRequest
3 голосов
/ 28 августа 2011

Я синхронизирую свое приложение Mac с приложением iPhone с помощью NSStream и пытаюсь зашифровать связь с помощью SSL.Я пытался запустить CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings) на стороне iPhone и CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings) на стороне Mac, когда я настраивал NSInputStream и NSOutputStream соответственно.Что касается словаря настроек, я следую совету http://iphonedevelopment.blogspot.com/2010/05/nsstream-tcp-and-ssl.html и игнорирую свойства сертификата.Однако такое шифрование, похоже, не работает, так как передача не проходит - есть ли что-то еще, что мне нужно сделать, чтобы эта функция работала?

Спасибо!

ПРАВИТЬ: Вот код:

На Mac:

NSOutputStream *outStream;
[service getInputStream:nil outputStream:&outStream];
[outStream open];

[outStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL 
forKey:NSStreamSocketSecurityLevelKey];  

        NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
kCFNull,kCFStreamSSLPeerName, nil];

CFWriteStreamSetProperty((CFWriteStreamRef)outStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);

int bytes = [outStream write:[rawPacket bytes] maxLength:[rawPacket length]];
[outStream close];

На iPhone:

CFReadStreamRef readStream;


NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"file"];

NSOutputStream *fileStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:NO];

[fileStream open];


CFStreamCreatePairWithSocket(NULL, fd, &readStream, NULL);

NSInputStream *networkStream = (NSInputStream *) readStream;

CFRelease(readStream);

[networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];

networkStream.delegate = self;
[networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[networkStream open];

[self.networkStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL 
                        forKey:NSStreamSocketSecurityLevelKey];

NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
kCFNull,kCFStreamSSLPeerName, nil];

CFReadStreamSetProperty((CFReadStreamRef)self.networkStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);

1 Ответ

1 голос
/ 11 сентября 2011

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

  1. Кажется подозрительным, что на стороне Mac есть только выходной поток, а на стороне iPhone - только входной поток. Я не понимаю, как можно получить рукопожатие SSL в таком одностороннем потоке, хотя вполне возможно, что оно решено за кадром.
  2. Вы пытаетесь установить связь между клиентом и сервером между тем, что, на мой взгляд, является двумя клиентскими приложениями. Как ваше приложение Mac обслуживает сертификат SSL? Редактировать : Теперь я вижу, что ваш outputStream основан на каком-то сервисном объекте, поэтому возможно, что вы обрабатываете это и просто не показывает код.
  3. Комментарий в статье , на которую вы ссылались, предполагает, что когда поток записывает «-1 байт», возникает проблема , открывающая выходной поток . Поэтому сначала вам нужно решить проблемы на стороне Mac, прежде чем переходить на приложение для iPhone (которое, я считаю, также имеет некоторые проблемы).
  4. Не похоже, что ваш поток чтения на стороне iPhone создан правильно. Все, что вы делаете, это объявляете это CFReadStreamRef readStream;. Я бы посмотрел на документацию , чтобы увидеть, как правильно ее создать.

В целом кажется, что вам не хватает многих частей, поэтому, надеюсь, некоторые из этих ресурсов помогут вам в правильном направлении: Связь Mac-iPhone с питоном-сервером , Apple Доброжелательная документация и ответ на соответствующий пост SO с некоторыми хорошими ссылками .

...