我写在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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top