2010-02-10 104 views
8

我正在编写一个在iPhone上使用NSStream的SSL功能的应用程序。我知道SSL正在工作,因为我可以使用SSL直接连接服务器。
我遇到了一个问题,其中使用starttls的协议要求我使用不安全的套接字进行通信,发送starttls命令,然后为SSL重用相同的套接字。据我所知,nsstream连接不能被重用,并且在打开连接后我无法启动SSL。已使用套接字上的NSStream SSL

我想过创建自己的套接字,手动进行通信,然后使用现有的套接字设置NSstream并以此方式启动SSL。但是,它似乎在套接字上的通信将其置于我无法启动SSL的状态。任何尝试使用nsstream套接字都会导致错误。

有什么想法?

+0

你有没有打过电话的setProperty:forKey:使用适当的安全常量在一个已经打开的NSSocket上?我相信底层的SecureTransport代码支持从未加密的初始连接切换到TLS/SSL。 – 2011-01-24 01:16:39

+0

所以我想通了。您应该使用CFsockets而不是NSsockets,然后在连接后应用SSL,即使文档说您不能这样做,它也会正确协商安全连接。 – anurodhp 2011-03-01 19:00:49

+0

没有“NSsockets”这样的东西 – user102008 2011-04-29 22:10:16

回答

7

这是正确的方法。虽然这样做(在套接字连接之后设置属性)没有记录,但这是直接来自我的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); 
+2

这可能是一个更好的主意,使用常量而不是将它们包装在字符串中;在这种情况下,常量和字符串可能会得到相同的结果,但并不总是如此。所以,kCFStreamSSLLevel而不是@“kCFStreamSSLLevel”。 – 2011-09-20 10:27:16

+0

我想在我的iOS 7应用程序中使用CFReadStreamSetProperty,但Xcode 5.1.1告诉mit“没有匹配函数调用'CFReadStreamSetProperty',尽管我有 #import #import < CoreFoundation/CFStream.h> 我还添加了CFNetwork.framework和CoreFoundation.framework。任何碰到如何解决这个问题? – 2014-05-04 08:42:21