2013-05-17 78 views
1

我試圖通過CFSocket連接在NSStream中使用SSL。所以,我寫這篇文章的代碼:SSL和NSStream

[self.input setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey]; 
[self.output setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey]; 

[self.input scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[self.output scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

[self.input open]; 
[self.output open]; 

但是,如果我從捲曲或瀏覽器發送請求到我的服務器我有這樣的錯誤:

error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

當我使用這個解決方案NSStream SSL on used socket我仍然有同樣的錯誤。

如何配置流使用ssl?

+0

如果你使用NSURLConnection,你可以得到異步回調,這就像一個流,特別是因爲你無法真正地尋找那個流 –

+0

你還有這個問題嗎? – Jashugan

回答

1

SSL/TLS帶有不同的版本。也許您連接到的服務器無法使用TLS版本1進行通信。請嘗試NSStreamSocketSecurityLevelNegotiatedSSL的值forKey:NSStreamSocketSecurityLevelKey以獲得最高版本的連接。

而且試圖以這種方式

// Setting properties. Atm every certificate is accepted and no hostname will be checked 
     NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
            [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
            [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
            kCFNull,kCFStreamSSLPeerName, 
            nil]; 
     CFReadStreamSetProperty((CFReadStreamRef)_inputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
     CFWriteStreamSetProperty((CFWriteStreamRef)_outputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 

的SSL/TLS連接設置的屬性,但請記住,沒有太多的認證和保護,防止人在這方面的中間人,當您使用就這樣。嘗試使用設置來處理其他問題。

此外,發佈更多代碼並嘗試連接到使用https的另一臺服務器。