我正在编写一个在iphone上使用NSStream的SSL函数的应用程序。我知道SSL正在工作,因为我可以使用SSL直接连接服务器。
我遇到了一个问题,使用starttls的协议要求我在套接字上使用unsecured进行通信,发送starttls命令,然后对SSL重用相同的套接字。据我所知,nsstream连接不能重用,并且在打开连接后不能在它们上启动SSL。
我想创建我自己的socket,手动在上面通信,然后使用现有的socket设置一个NSstream,并以这种方式启动SSL。但是,套接字上的通信似乎将其置于无法在其上启动SSL的状态。对nsstream使用套接字的任何尝试都会导致错误。
有什么想法吗?
发布于 2011-06-06 12:34:32
这才是正确的做法。虽然这样做(在套接字连接后设置属性)是没有文档记录的,但这是我的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);https://stackoverflow.com/questions/2237735
复制相似问题