这是正确的方法。虽然这样做(在套接字连接之后设置属性)没有记录,但这是直接来自我的Monal xmpp客户端的代码,并且苹果从未在应用商店给我任何问题。
NSInputStream *iStream;
NSOutputStream *oStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream);
[iStream open];
[oStream open];
一旦连接已经打开,你会得到NSStreamEventOpenCompleted和STARTTLS命令已经发送到来自客户端的主机:
NSDictionary *settings = [ [NSDictionary alloc ]
initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredCertificates",
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredRoots",
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsAnyRoot",
[NSNumber numberWithBool:NO], @"kCFStreamSSLValidatesCertificateChain",
[NSNull null],@"kCFStreamSSLPeerName",
@"kCFStreamSocketSecurityLevelNegotiatedSSL",
@"kCFStreamSSLLevel",
nil ];
CFReadStreamSetProperty((CFReadStreamRef)iStream,
@"kCFStreamPropertySSLSettings", (CFTypeRef)settings);
CFWriteStreamSetProperty((CFWriteStreamRef)oStream,
@"kCFStreamPropertySSLSettings", (CFTypeRef)settings);
你有没有打过电话的setProperty:forKey:使用适当的安全常量在一个已经打开的NSSocket上?我相信底层的SecureTransport代码支持从未加密的初始连接切换到TLS/SSL。 – 2011-01-24 01:16:39
所以我想通了。您应该使用CFsockets而不是NSsockets,然后在连接后应用SSL,即使文档说您不能这样做,它也会正确协商安全连接。 – anurodhp 2011-03-01 19:00:49
没有“NSsockets”这样的东西 – user102008 2011-04-29 22:10:16