3

NSStream を使用して Mac アプリケーションを iPhone アプリケーションと同期しており、SSL で通信を暗号化しようとしています。NSInputStream と NSOutputStream をそれぞれ設定するときにCFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings)、iPhone 側と Mac 側で実行しようとしました。設定辞書については、 http://iphonedevelopment.blogspot.com/2010/05/nsstream-tcp-and-ssl.htmlCFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings)のアドバイスに従い、証明書のプロパティを無視しています。ただし、転送が行われないため、この方法での暗号化は機能しないようです。この機能を機能させるために他に何かする必要がありますか?

ありがとう!

編集:ここにいくつかのコードがあります:

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. あなたは、私には2つのクライアントアプリケーションのように見えるものの間でクライアントサーバー通信を試みています。MacアプリはSSL証明書をどのように提供していますか?編集:outputStreamが何らかのサービスオブジェクトに基づいていることがわかりました。したがって、これを処理していて、コードを表示していない可能性があります。
  3. リンクした記事のコメントは、ストリームが「-1バイト」を書き込むときに、出力ストリームを開くときに問題が発生することを示唆しています。したがって、iPhoneアプリに移行する前に、まずMac側の問題を解決する必要があります(これにもいくつかの問題があると思います)。
  4. iPhone側の読み取りストリームが正しく作成されていないようです。で宣言するだけですCFReadStreamRef readStream;ドキュメントを見て、適切に作成する方法を確認します。

全体として、多くの部分が欠けているように思われるので、うまくいけば、これらのリソースのいくつかが軌道に乗るのに役立つでしょう:PythonサーバーとのMac-iPhone通信AppleのBonjourドキュメント、および関連するSO投稿の回答いくつかの良いリンク

于 2011-09-11T04:59:40.553 に答える