2013-05-17 46 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的另一台服务器。