NSStream SSL上使用的插座
题
我写在iPhone上使用NSStream的SSL功能的应用。我知道,SSL是工作,因为我可以使用SSL服务器直接连接。结果 我也遇到过,其中使用STARTTLS协议要求我不安全插座上进行通信,发送STARTTLS命令,然后重新使用SSL同样的插座有问题。据我所知nsstream连接不能重复使用,我已经打开了连接后,我无法对他们启动SSL。
我想过创造我自己的插座,手动就可以了沟通,然后利用现有的插座设立NSstream和启动SSL的方式。然而,它出现在插座上进行通信的地方就在我不能上开始SSL的状态。任何企图使用nsstream结果套接字错误。
任何想法?
解决方案
这是做到这一点的正确方法。而这样做(设置插座连接后的属性)是无证,这是代码直接从我的虹雉XMPP客户端和苹果从来没有给我在App Store上的任何问题。
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);
不隶属于 StackOverflow