已使用套接字上的NSStream SSL
我正在编写一个在iPhone上使用NSStream的SSL功能的应用程序。我知道SSL正在工作,因为我可以使用SSL直接连接服务器。
我遇到了一个问题,其中使用starttls的协议要求我使用不安全的套接字进行通信,发送starttls命令,然后为SSL重用相同的套接字。据我所知,nsstream连接不能被重用,并且在打开连接后我无法启动SSL。已使用套接字上的NSStream SSL
我想过创建自己的套接字,手动进行通信,然后使用现有的套接字设置NSstream并以此方式启动SSL。但是,它似乎在套接字上的通信将其置于我无法启动SSL的状态。任何尝试使用nsstream套接字都会导致错误。
有什么想法?
这是正确的方法。虽然这样做(在套接字连接之后设置属性)没有记录,但这是直接来自我的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);
这可能是一个更好的主意,使用常量而不是将它们包装在字符串中;在这种情况下,常量和字符串可能会得到相同的结果,但并不总是如此。所以,kCFStreamSSLLevel而不是@“kCFStreamSSLLevel”。 – 2011-09-20 10:27:16
我想在我的iOS 7应用程序中使用CFReadStreamSetProperty,但Xcode 5.1.1告诉mit“没有匹配函数调用'CFReadStreamSetProperty',尽管我有 #import
你有没有打过电话的setProperty:forKey:使用适当的安全常量在一个已经打开的NSSocket上?我相信底层的SecureTransport代码支持从未加密的初始连接切换到TLS/SSL。 – 2011-01-24 01:16:39
所以我想通了。您应该使用CFsockets而不是NSsockets,然后在连接后应用SSL,即使文档说您不能这样做,它也会正确协商安全连接。 – anurodhp 2011-03-01 19:00:49
没有“NSsockets”这样的东西 – user102008 2011-04-29 22:10:16