2011-08-28 76 views
3

我正在使用NSStream将我的Mac应用程序与我的iPhone应用程序同步,并试图使用SSL加密通信。我试着在iPhone端运行CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings),在Mac端运行CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings),分别设置NSInputStream和NSOutputStream。对于设置字典,我遵循http://iphonedevelopment.blogspot.com/2010/05/nsstream-tcp-and-ssl.html的建议并忽略了证书的属性。但是,以这种方式对它进行加密似乎没有效果,因为传输没有经过 - 还有其他事情我需要做以获得此功能的工作吗?将SSL添加到iOS应用程序同步

谢谢!

编辑:下面是一些代码:

在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); 
+0

“转移不通过”?你有什么错误吗?日志? – prakash

+0

@Prakash在mac上它写入“-1字节”,并在iPhone上停止状态为“Stream open error”的接收。 – PF1

+1

@Prakash - 这里要提到一件事。如果您打算使用SSL,则必须填写符合加密标准的导出规则!即使使用iOS的内置SSL功能,您也需要获得美国政府的出口合规性。检查这个问题:http://stackoverflow.com/questions/2128927/using-ssl-in-an-iphone-app-export-compliance – Chris

回答

1

我不知道究竟的问题是什么。但有几件事情会为我提升旗帜。

  1. 这似乎很可疑,你的Mac端只有一个输出流,你的iPhone端只有一个输入流。我没有看到如何以这种单向流的方式进行SSL握手,尽管它可能在幕后处理。
  2. 您正在尝试在我看来是两个客户端应用程序之间进行客户端 - 服务器通信。您的Mac应用程序如何提供SSL证书? 编辑:我现在看到你的outputStream是基于某个服务对象的,所以有可能你正在处理这个,而不是显示代码。
  3. 您链接到的article中的一条评论意味着当一个流写入“-1字节”时,出现打开输出流的问题。所以首先你需要在转移到iPhone应用程序之前解决Mac端的问题(我认为这也有一些问题)。
  4. 它看起来不像你在iPhone端的阅读流被正确创建。你所要做的就是用CFReadStreamRef readStream;来声明它。我会看看documentation,看看如何正确创建一个。

一切的一切,好像你就错过了很多件,所以希望一些资源可以帮助你走上正轨:Mac-iPhone communication with a python serverApple's Bonjour documentation,并an answer on a related SO post with some good links