iOS 5 и Проблемы функциональной совместимости TLS 1.2
iOS 5 реализация TLS был обновлен для поддержки версии протокола 1.2 TLS. Некоторые несовместимые реализации сервера TLS не обрабатывают TLS 1.2 и не понижают корректно к версии поддерживаемого протокола. Это Техническое примечание объясняет степень этой проблемы функциональной совместимости и как работать вокруг этого.
Введение
iOS 5 реализация TLS был обновлен для поддержки версии протокола 1.2 TLS. Некоторые несовместимые реализации сервера TLS не реализуют TLS 1.2 и, что еще более важно, не понижают корректно к версии поддерживаемого протокола. В результате можно найти, что некоторые клиентские приложения TLS, созданные против iOS 5 SDK, могут не соединиться с некоторыми серверами TLS, когда то же приложение, созданное против предыдущей версии iOS SDK, соединилось бы.
Если Ваше приложение реализует клиент TLS, использующий APIs CFStream или SecureTransport APIs, то оно теперь примет значение по умолчанию к использованию квитирования TLS 1.2 при соединении с сервером TLS. Совместимые реализации сервера TLS, не поддерживающие версию протокола TLS 1.2, будут сигнализировать клиент для снижения качества к версии поддерживаемого протокола. По умолчанию реализация iOS 5 TLS позволит серверу понижать до версии протокола SSL 3. С другой стороны, несовместимая реализация сервера TLS может, после получения квитирования TLS 1.2, просто завершить квитирование TLS или соединение.
Затронутые серверы включают, но не ограничиваются, любые серверы реализовали использование SecureTransport или APIs CFStream и работы любой в настоящее время выпускаемой системы Mac OS X или устройства на iOS до iOS 5.0.
Обходные решения
К обходному решению несовместимые реализации сервера клиенты TLS должны попытаться повторно соединить использование более низкой версии протокола, пока соединение не успешно выполняется, или все допустимые версии протокола перестали работать.
Это обходное решение реализовано на уровне NSURLConnection, так, чтобы клиенты TLS реализовали поверх NSURLConnection — и вещи, использующие NSURLConnection, как UIWebView — не должен быть затронут.
Клиентские приложения TLS реализовали использование APIs CFStream и соединились против iOS, SDK до iOS 5 SDK продолжит использовать TLS 1.0 в качестве версии протокола по умолчанию и не должен быть затронут.
Для клиентов TLS, реализованных непосредственно с помощью SecureTransport APIs (только доступный начиная с iOS 5.0 SDK), разработчики должны использовать SSLSetProtocolVersionMax и SSLSetProtocolVersionMin APIs для указания позволенных версий протокола TLS. Квитирование будет опробовано с помощью указанной максимальной версии.
Для TLS клиенты реализовали использование APIs CFStream, разработчики могут установить максимальную версию протокола с помощью CFReadStreamSetProperty API как показано в Перечислении 1
Перечисление 1 , Как установить версию протокола TLS на CFStream и CFHTTPStream.
// Use the following code to configure CFStream (e.g., CFStreamCreatePairWithSocketToHost) |
// or CFHTTPStream (e.g., CFReadStreamCreateForHTTPRequest) based read streams to connect |
// with specific TLS protocol versions. |
// Insert before calling CFReadStreamOpen(). |
const void* keys[] = { kCFStreamSSLLevel }; |
// New CFString values available only on iOS 5: |
// (if these values are used on versions before iOS 5, then will |
// default to max TLS 1.0, min SSLv3) |
// kCFStreamSocketSecurityLevelTLSv1_0SSLv3 configures max TLS 1.0, min SSLv3 |
// (same as default behavior on versions before iOS 5). |
// kCFStreamSocketSecurityLevelTLSv1_0 configures to use only TLS 1.0. |
// kCFStreamSocketSecurityLevelTLSv1_1 configures to use only TLS 1.1. |
// kCFStreamSocketSecurityLevelTLSv1_2 configures to use only TLS 1.2. |
const void* values[] = { CFSTR("kCFStreamSocketSecurityLevelTLSv1_0SSLv3") }; |
CFDictionaryRef sslSettingsDict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, |
&kCFTypeDictionaryKeyCallBacks, |
&kCFTypeDictionaryValueCallBacks); |
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, sslSettingsDict); |
CFRelease(sslSettingsDict); |
История версии документа
| Дата | Примечания |
|---|---|
| 14.10.2011 | Новый документ, описывающий проблему функциональной совместимости TLS между iOS 5 клиентов и некоторыми реализациями серверов, и предлагающий обходное решение. |