NSStream SSL на используемом сокете

Я пишу приложение, которое использует функции SSL NSStream на iphone. Я знаю, что SSL работает, потому что я могу напрямую подключать серверы с помощью SSL.
Я столкнулся с проблемой, когда протоколы, использующие starttls, требуют, чтобы я взаимодействовал через сокет с незащищенным, отправлял команду starttls, а затем повторно использовал тот же сокет для SSL. . Насколько я знаю, соединения nsstream нельзя использовать повторно, и я не могу запустить SSL на них после того, как открыл соединение.

Я подумал о создании собственного сокета, обмене данными с ним вручную, а затем настройке NSstream с использованием существующего сокета и запуске SSL таким образом. Однако, похоже, что общение в сокете переводит его в состояние, когда я не могу запустить на нем SSL. Любая попытка использовать сокет для nsstream приводит к ошибке.

Есть предположения?


person anurodhp    schedule 10.02.2010    source источник
comment
Вы пытались вызвать setProperty:forKey: с соответствующими константами безопасности для уже открытого NSSocket? Я считаю, что базовый код SecureTransport поддерживает переключение на TLS/SSL при незашифрованном начальном соединении.   -  person Graham Miln    schedule 24.01.2011
comment
Итак, я понял это. Вы должны использовать CFsockets, а не NSsockets, а затем применять SSL ПОСЛЕ соединения, даже если в документации сказано, что вы не можете этого сделать, оно будет правильно согласовывать безопасное соединение.   -  person anurodhp    schedule 01.03.2011
comment
нет такой вещи, как NSsockets   -  person user102008    schedule 30.04.2011
comment
Пожалуйста, добавьте свое решение в качестве ответа и отметьте его как таковое. Это загромождает список вопросов без ответов прямо сейчас, и вы не получаете очков репутации, которые могли бы использовать.   -  person Jeremy W. Sherman    schedule 03.06.2011


Ответы (1)


Это правильный способ сделать это. в то время как это (установка свойства после подключения к сокету) недокументировано, это код непосредственно из моего клиента Monal xmpp, и Apple никогда не доставляла мне никаких проблем в магазине приложений.

 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);
person anurodhp    schedule 06.06.2011
comment
Вероятно, лучше использовать константы, а не оборачивать их в строки; в этом случае константы и строки могут давать один и тот же результат, но это не всегда так. Итак, kCFStreamSSLLevel вместо @kCFStreamSSLLevel. - person Rob Rix; 20.09.2011
comment
Я пытаюсь использовать CFReadStreamSetProperty в своем приложении iOS 7, но Xcode 5.1.1 сообщает mit Нет соответствующей функции для вызова «CFReadStreamSetProperty», хотя у меня есть #import ‹CoreFoundation/CoreFoundation.h› #import ‹CoreFoundation/CFStream.h › и я также добавил CFNetwork.framework и CoreFoundation.framework. Любой хит, как это исправить? - person geri-m; 04.05.2014