我正在使用 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 的建议并忽略证书的属性。但是,以这种方式加密它似乎不起作用,因为传输没有通过 - 我还需要做些什么才能让这个功能正常工作吗?
谢谢!
编辑:这是一些代码:
在苹果机上:
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);
最佳答案
我不确定确切您的问题是什么。但有几件事让我感到不安。
- 您的 Mac 端只有一个输出流,而您的 iPhone 端只有一个输入流,这似乎有点可疑。我看不出如何在这样的单向流中进行 SSL 握手,尽管它可能在幕后得到处理。
- 您正在尝试在我看来似乎是两个客户端应用程序之间进行客户端-服务器通信。您的 Mac 应用程序如何提供 SSL 证书? 编辑:我现在看到您的 outputStream 是基于某个服务对象的,所以您可能正在处理它,只是没有显示代码。
- 在 article 中发表评论您链接到的内容表明,当流写入“-1 字节”时,打开输出流 时出现问题。因此,在转向 iPhone 应用程序之前,您首先需要解决 Mac 端的问题(我相信它也存在一些问题)。
- 您在 iPhone 端的阅读流似乎没有正确创建。您所做的就是使用
CFReadStreamRef readStream;
声明它。我会看看 documentation看看如何正确创建一个。
总而言之,您似乎遗漏了很多部分,因此希望这些资源中的一些可以帮助您走上正轨:Mac-iPhone communication with a python server , Apple's Bonjour documentation , 和 an answer on a related SO post with some good links .
关于cocoa-touch - 将 SSL 添加到 iOS 应用程序同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219045/