将SSL添加到iOS Application Sync

时间:2011-08-28 04:28:45

标签: cocoa-touch cocoa ssl nsstream cfnetwork

我正在使用NSStream将我的Mac应用程序与我的iPhone应用程序同步,并尝试使用SSL加密通信。当我分别设置NSInputStream和NSOutputStream时,我试图在iPhone端运行CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings)并在Mac端运行CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings)。对于设置字典,我遵循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 个答案:

答案 0 :(得分:1)

我不确定完全你的问题是什么。但是有几件事会为我举起旗帜。

  1. 您的Mac端只有一个输出流,而您的iPhone端只有一个输入流,这似乎很可疑。我不知道如何在单向流中进行SSL握手,尽管它可能会在幕后处理。
  2. 您正在尝试客户端 - 服务器之间的通信,对我来说,似乎是两个客户端应用程序。您的Mac应用如何提供SSL证书? 编辑:我现在看到你的outputStream是基于某个服务对象的,所以你可能正在处理它而只是没有显示代码。
  3. 您链接的article中的评论表明,当流写入“-1个字节”时,打开输出流时出现问题。首先,您需要在转移到iPhone应用程序之前解决Mac方面的问题(我认为这也存在一些问题)。
  4. 看起来你的iPhone端读取流没有正确创建。您所做的就是用CFReadStreamRef readStream;声明它。我会查看documentation以了解如何正确创建一个。
  5. 总而言之,您似乎错过了很多篇幅,所以希望其中一些资源可以帮助您顺利开展:Mac-iPhone communication with a python serverApple's Bonjour documentationan answer on a related SO post with some good links