2010-02-10 49 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