3

我正在使用 NSStream 将我的 Mac 应用程序与我的 iPhone 应用程序同步,并尝试使用 SSL 加密通信。当我分别设置 NSInputStream 和 NSOutputStream 时,我尝试CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings)在 iPhone 端和 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);
4

1 回答 1

1

我不确定你的问题到底是什么。但是有几件事对我来说很重要。

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

总而言之,您似乎遗漏了很多内容,因此希望其中一些资源可以帮助您走上正轨:Mac-iPhone 与 python 服务器的通信Apple 的 Bonjour 文档以及相关 SO 帖子的答案一些好的链接

于 2011-09-11T04:59:40.553 回答