我尝试在NSStream中使用SSL通过CFSocket连接。所以我写这段代码:
[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];
但是如果我从curl或浏览器向服务器发送请求,我就会出现这个错误:
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
当我在使用的套接字上使用此解决方案时,我仍然有相同的错误。
如何配置流使用ssl?
SSL/TLS有不同的版本。可能您正在连接的服务器无法使用TLS版本1进行通信。为forKey:NSStreamSocketSecurityLevelKey
尝试值NSStreamSocketSecurityLevelNegotiatedSSL
,以获得您连接的最高可能版本。
进一步尝试以这种方式设置SSL/TLS连接的属性
// 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);
但是请记住,当您以这种方式使用它时,没有太多的身份验证和防止中间人的保护。尝试使用设置来处理其他问题。