【问题标题】:NSStream SSL on used socket使用的套接字上的 NSStream SSL
【发布时间】:2010-02-10 15:04:08
【问题描述】:

我正在编写一个在 iphone 上使用 NSStream 的 SSL 功能的应用程序。我知道 SSL 有效,因为我可以使用 SSL 直接连接服务器。
我遇到了一个问题,使用 starttls 的协议要求我在不安全的套接字上进行通信,发送 starttls 命令,然后为 SSL 重用同一个套接字。据我所知,nsstream 连接无法重复使用,并且在打开连接后我无法在它们上启动 SSL。

我考虑过创建自己的套接字,手动在其上进行通信,然后使用现有套接字设置 NSstream 并以这种方式启动 SSL。但是,似乎套接字上的通信将其置于我无法在其上启动 SSL 的状态。任何将套接字用于 nsstream 的尝试都会导致错误。

有什么想法吗?

【问题讨论】:

  • 您是否尝试过在已打开的 NSSocket 上使用适当的安全常量调用 setProperty:forKey:?我相信底层的 SecureTransport 代码支持从未加密的初始连接切换到 TLS/SSL。
  • 所以我想通了。您应该使用 CFsockets 而不是 NSsockets,然后在连接后应用 SSL,即使文档说您不能这样做,它也会正确协商安全连接。
  • 没有“NSsockets”之类的东西
  • 请将您的解决方案添加为答案并将其标记为答案。这使未回答的问题列表现在变得杂乱无章,而且您没有获得可以使用的代表点数。

标签: iphone sockets ssl nsstream


【解决方案1】:

这是执行此操作的正确方法。虽然这样做(在套接字连接后设置属性)没有记录,但这是直接来自我的 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"。
  • 我正在尝试在我的 iOS 7 应用程序中使用 CFReadStreamSetProperty,但 Xcode 5.1.1 告诉 mit“尽管我有 #import #import 我还添加了 CFNetwork.framework 和 CoreFoundation.framework。任何命中如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2014-11-06
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多