CFStream SSL ошибка -9800
Мое приложение для iOS содержит 2 версии: сервер и клиент. Сервер отправляет сервис через Bonjour и ждет клиента. Клиент ищет эти сервисы и подключается к серверу. После этого все коммуникации осуществляются через CFSockets.
Вот мой код для настройки потоков для таких сообщений:
- (BOOL)setupSocketStreams {
if ( readStream == nil || writeStream == nil ) {
return NO;
}
incomingDataBuffer = [[NSMutableData alloc] init];
outgoingDataBuffer = [[NSMutableData alloc] init];
// Turning SSL on
NSDictionary *sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:(id)kCFBooleanFalse, (id)kCFStreamSSLValidatesCertificateChain, nil];
CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, sslSettings);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, sslSettings);
CFReadStreamSetProperty(
readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue
);
CFWriteStreamSetProperty(
writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue
);
CFOptionFlags registeredEvents =
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred
;
CFStreamClientContext ctx = {
0, // version
self, // info
NULL, // retain callback
NULL, // release callback
NULL // copyDescription callback
};
CFReadStreamSetClient(
readStream,
registeredEvents,
readStreamEventHandler,
&ctx
);
CFWriteStreamSetClient(
writeStream,
registeredEvents,
writeStreamEventHandler,
&ctx
);
CFReadStreamScheduleWithRunLoop(
readStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes
);
CFWriteStreamScheduleWithRunLoop(
writeStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes
);
if ( ! CFReadStreamOpen(readStream) || ! CFWriteStreamOpen(writeStream)) {
[self close];
return NO;
}
if ([self.delegate respondsToSelector:@selector(establishedConnection:)]) {
[self.delegate establishedConnection:self];
}
return YES;
}
Не говоря уже о том, что включение SSL в этом коде работает нормально, но в противном случае я получаю сообщение об ошибке:
Error:
The operation couldn’t be completed. (OSStatus error -9800.)
Что это за проблема?
Спасибо!
1 ответ
Решение
Известна проблема с поддержкой TLS1.2 в iOS 5: https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309
Установив для kCFStreamSSLLevel значение @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", я смог исправить проблему -9800 в своем приложении.