Описание
TLS даёт возможность клиент-серверным приложениям осуществлять связь в сети таким образом, что нельзя производить прослушивание пакетов и осуществить несанкционированный доступ.
Так как большинство протоколов связи может быть использовано как с, так и без TLS (или SSL), при установке соединения необходимо явно указать серверу, хочет ли клиент устанавливать TLS. Это может быть достигнуто либо с помощью использования унифицированного номера порта, по которому соединение всегда устанавливается с использованием TLS (как, например, порт 443 для HTTPS), либо с использованием произвольного порта и специальной команды серверу со стороны клиента на переключение соединения на TLS с использованием специальных механизмов протокола (как, например, STARTTLS для протоколов электронной почты).
Как только клиент и сервер договорились об использовании TLS, им необходимо установить защищённое соединение. Это делается с помощью процедуры подтверждения связи[4][5]. Во время этого процесса клиент и сервер принимают соглашение относительно различных параметров, необходимых для установки безопасного соединения.
Основные шаги процедуры создания защищённого сеанса связи:
- клиент подключается к серверу, поддерживающему TLS, и запрашивает защищённое соединение;
- клиент предоставляет список поддерживаемых алгоритмов шифрования и хеш-функций;
- сервер выбирает из списка, предоставленного клиентом, наиболее надёжные алгоритмы среди тех, которые поддерживаются сервером, и сообщает о своём выборе клиенту;
- сервер отправляет клиенту цифровой сертификат для собственной аутентификации. Обычно цифровой сертификат содержит имя сервера, имя удостоверяющего центра сертификации и открытый ключ сервера;
- клиент, до начала передачи данных, проверяет валидность (аутентичность) полученного серверного сертификата относительно имеющихся у клиента корневых сертификатов удостоверяющих центров (центров сертификации). Клиент также может проверить, не отозван ли серверный сертификат, связавшись с сервисом доверенного удостоверяющего центра;
- для шифрования сессии используется сеансовый ключ. Получение общего секретного сеансового ключа клиентом и сервером проводится по протоколу Диффи-Хеллмана. Существует исторический метод передачи сгенерированного клиентом секрета на сервер при помощи шифрования асимметричной криптосистемой RSA (используется ключ из сертификата сервера). Данный метод не рекомендован, но иногда продолжает встречаться на практике.
На этом заканчивается процедура подтверждения связи. Между клиентом и сервером установлено безопасное соединение, данные, передаваемые по нему, шифруются и расшифровываются с использованием симметричной криптосистемы до тех пор, пока соединение не будет завершено.
При возникновении проблем на некоторых из вышеуказанных шагов подтверждение связи может завершиться с ошибкой, а безопасное соединение не будет установлено.
Безопасность
TLS имеет множество мер безопасности:
- Защита от понижения версии протокола к предыдущей (менее защищённой) версии или менее надёжному алгоритму шифрования;
- Нумерация последовательных записей приложения и использование порядкового номера в коде аутентификации сообщения (MAC);
- Использование ключа в идентификаторе сообщения (только владелец ключа может сгенерировать код аутентификации сообщения). Алгоритм вычисления кода аутентификации (HMAC), используемый во многих сессиях TLS, определён в RFC 2104;
- Сообщение, которым заканчивается подтверждение связи («Finished»), используется для подтверждения аутентичности ранее переданных сообщений и, таким образом, выбранных параметров TLS-соединения.
Уязвимость протокола TLS 1.0, которая считалась теоретической, была продемонстрирована на конференции Ekoparty в сентябре 2011 года. Демонстрация включала в себя дешифрование cookies, использованных для аутентификации пользователя[6].
Уязвимость в фазе возобновления соединения, обнаруженная в августе 2009 года, позволяла криптоаналитику, способному взломать https-соединение, добавлять собственные запросы в сообщения, отправленные от клиента к серверу[7]. Так как криптоаналитик не может дешифровать переписку сервера и клиента, этот тип атаки отличается от стандартной атаки, типа человек посередине. В случае, если пользователь не обращает внимания на индикацию браузера о том, что сессия является безопасной (обычно значок замка), уязвимость может быть использована для атаки типа человек посередине[8]. Для устранения этой уязвимости было предложено как на стороне клиента, так и на стороне сервера добавлять информацию о предыдущем соединении и осуществлять проверку при возобновлении соединения. Это было представлено в стандарте RFC 5746, а также реализовано в последних версиях OpenSSL[9] и других библиотеках[10][11].
Также существуют варианты атак, основанные непосредственно на программной реализации протокола, а не на его алгоритме[12].
Процедура подтверждения связи в TLS в деталях
Согласно протоколу TLS, приложения обмениваются записями, инкапсулирующими (хранящими внутри себя) информацию, которая должна быть передана. Каждая из записей может быть сжата, дополнена, зашифрована или идентифицирована MAC (код аутентификации сообщения) в зависимости от текущего состояния соединения (состояния протокола). Каждая запись в TLS содержит следующие поля: Content Type (определяет тип содержимого записи), Version (поле, указывающее версию протокола TLS) и Length (поле, указывающее длину пакета).
Когда соединение только устанавливается, взаимодействие идёт по протоколу TLS handshake, content type которого - 22.
Простое подтверждение связи в TLS
Далее показан простой пример установления соединения, при котором сервер (но не клиент) проходит аутентификацию по его сертификату.
- Фаза переговоров:
- Клиент посылает сообщение ClientHello, указывая последнюю версию поддерживаемого TLS-протокола, случайное число и список поддерживаемых шифронаборов (методов шифрования, англ. cipher suites), подходящих для работы с TLS;
- Сервер отвечает сообщением ServerHello, содержащим: выбранную сервером версию протокола, случайное число, сгенерированное сервером, выбранный шифронабор из списка, предоставленного клиентом;
- Сервер посылает сообщение Certificate, которое содержит цифровой сертификат сервера (в зависимости от алгоритма шифрования этот этап может быть пропущен);
- Если переданных сервером данных недостаточно для выработки общего симметричного секретного ключа в рамках выбранного шифронабора, сервер передаёт сообщение ServerKeyExchange, в котором передаются необходимые данные. Например, в ServerKeyExchange передаётся серверная часть обмена для протокола Диффи-Хеллмана;
- Сервер отсылает сообщение ServerHelloDone, идентифицирующее окончание первого раунда установления соединения;
- Клиент отвечает сообщением ClientKeyExchange, которое содержит клиентскую часть протокола Диффи-Хеллмана или зашифрованный открытым ключом из сертификата сервера секрет (PreMasterSecret);
- Клиент и сервер, используя ключ PreMasterSecret и случайно сгенерированные числа, вычисляют общий секрет. Вся остальная информация о сеансовом ключе будет получена из общего секрета;
- Клиент посылает сообщение ChangeCipherSpec, которое указывает на то, что вся последующая информация будет зашифрована установленным в процессе подтверждения связи алгоритмом, используя общий секретный ключ. Это сообщение уровня записей и поэтому имеет тип 20, а не 22;
- Клиент посылает сообщение Finished, которое содержит хеш и MAC, сгенерированные на основе предыдущих сообщений процедуры подтверждения связи;
- Сервер пытается расшифровать Finished-сообщение клиента и проверить хеш и МАС. Если процесс расшифровки или проверки не удаётся, подтверждение связи считается неудавшимся, и соединение должно быть оборвано;
- Сервер посылает ChangeCipherSpec и зашифрованное сообщение Finished, и в свою очередь клиент тоже выполняет расшифровку и проверку.
С этого момента подтверждение связи считается завершённым, протокол - установленным. Всё последующее содержимое пакетов идёт с типом 23, а все данные будут зашифрованы.
Подтверждение связи с аутентификацией клиента
В данном примере показана полная аутентификация клиента (в дополнение к аутентификации сервера, как в предыдущем примере) с помощью обмена сертификатами между сервером и клиентом.
- Фаза переговоров:
- Клиент посылает сообщение ClientHello, указывая последнюю версию поддерживаемого TLS-протокола, случайное число и список поддерживаемых методов шифрования и сжатия, подходящих для работы с TLS;
- Сервер отвечает сообщением ServerHello, содержащим: выбранную сервером версию протокола, случайное число, посланное клиентом, подходящий алгоритм шифрования и сжатия из списка предоставленного клиентом;
- Сервер посылает сообщение Certificate, которое содержит цифровой сертификат сервера (в зависимости от алгоритма шифрования этот этап может быть пропущен);
- Сервер посылает сообщение CertificateRequest, которое содержит запрос сертификата клиента для взаимной проверки подлинности;
- Клиент посылает сообщение Certificate, которое содержит цифровой сертификат клиента;
- Сервер отсылает сообщение ServerHelloDone, идентифицирующее окончание подтверждения связи;
- Клиент отвечает сообщением ClientKeyExchange, которое содержит открытый ключ PreMasterSecret или ничего (опять же зависит от алгоритма шифрования);
- Клиент и сервер, используя ключ PreMasterSecret и случайно сгенерированные числа, вычисляют общий секретный ключ. Вся остальная информация о ключе будет получена из общего секретного ключа (и сгенерированных клиентом и сервером случайных значений);
- Клиент посылает сообщение ChangeCipherSpec, которое указывает на то, что вся последующая информация будет зашифрована установленным в процессе подтверждения связи алгоритмом, используя общий секретный ключ. Это сообщения уровня записей и поэтому имеет тип 20, а не 22;
- Клиент посылает сообщение Finished, которое содержит хеш и MAC, сгенерированные на основе предыдущих сообщений процедуры подтверждения связи;
- Сервер пытается расшифровать Finished-сообщение клиента и проверить хеш и МАС. Если процесс расшифровки или проверки не удаётся, подтверждение связи считается неудавшимся, и соединение должно быть оборвано.
- Сервер посылает ChangeCipherSpec и зашифрованное сообщение Finished, и в свою очередь клиент тоже выполняет расшифровку и проверку.
С этого момента подтверждение связи считается завершённым, протокол установленным. Всё последующее содержимое пакетов идёт с типом 23, а все данные будут зашифрованы.
Возобновление TLS-соединения
Алгоритмы асимметричного шифрования, использующиеся при генерации сеансового ключа, обычно являются дорогими с точки зрения вычислительных мощностей. Для того чтобы избежать их повторения при возобновлении соединения, TLS создаёт специальный ярлык при подтверждении связи, использующийся для возобновления соединения. При этом при обычном подтверждении связи клиент добавляет в сообщение ClientHello идентификатор предыдущей сессии session id. Клиент связывает идентификатор session id с IP-адресом сервера и TCP-портом так, чтобы при соединении к серверу можно было использовать все параметры предыдущего соединения. Сервер сопоставляет идентификатор предыдущей сессии session id c параметрами соединения, такими как использованный алгоритм шифрования и master secret. Обе стороны должны иметь одинаковый master secret, иначе соединение не будет установлено. Это предотвращает использование session id криптоаналитиком для получения несанкционированного доступа. Случайные цифровые последовательности в сообщениях ClientHello и ServerHello позволяют гарантировать, что сгенерированный сеансовый ключ будет отличаться от сеансового ключа при предыдущем соединении. В RFC такой тип подтверждения связи называется сокращённым.
- Фаза переговоров:[13]
- Клиент посылает сообщение ClientHello, указывая последнюю версию поддерживаемого TLS-протокола, случайное число и список поддерживаемых методов шифрования и сжатия, подходящих для работы с TLS; Также в сообщение добавляется идентификатор предыдущего соединения session id.
- Сервер отвечает сообщением ServerHello, содержащим: выбранную сервером версию протокола, случайное число, посланное клиентом, подходящий алгоритм шифрования и сжатия из списка предоставленного клиентом. Если сервер узнал идентификатор сессии session id, то он добавляет в сообщение ServerHello тот же самый идентификатор session id. Это является сигналом для клиента о том, что можно использовать возобновление предыдущей сессии. Если сервер не узнал идентификатор сессии session id, то он добавляет в сообщение ServerHello другое значение вместо session id. Для клиента это означает, что использовать возобновлённое соединение нельзя. Таким образом, сервер и клиент должны иметь одинаковый master secret и случайные числа для генерации сеансового ключа;
- Сервер посылает сообщение ChangeCipherSpec, которое указывает на то, что вся последующая информация будет зашифрована установленным в процессе подтверждения связи алгоритмом, используя общий секретный ключ. Это сообщения уровня записей и поэтому имеет тип 20, а не 22;
- Сервер посылает зашифрованное сообщение Finished, которое содержит хеш и MAC, сгенерированные на основе предыдущих сообщений процедуры подтверждения связи;
- Клиент пытается расшифровать Finished сообщение сервера и проверить хеш и МАС. Если процесс расшифровки или проверки не удаётся, подтверждение связи считается неудавшимся, и соединение должно быть оборвано;
- Клиент посылает сообщение ChangeCipherSpec, которое указывает на то, что вся последующая информация будет зашифрована установленным в процессе подтверждения связи алгоритмом, используя общий секретный ключ.
- Клиент посылает своё зашифрованное сообщение Finished;
- Сервер схожим образом пытается расшифровать Finished-сообщение клиента и проверить хеш и MAC;
- С этого момента подтверждение связи считается завершённым, протокол - установленным. Всё последующее содержимое пакетов идёт с типом 23, а все данные будут зашифрованы.
Кроме преимуществ с точки зрения производительности[14], алгоритм возобновления соединения может быть использован для реализации единого входа, поскольку гарантируется, что исходная сессия, как и любая возобновлённая сессия, инициирована тем же самым клиентом (RFC 5077). Это имеет особенно важное значение для реализации FTPS протокола, который в противном случае был бы уязвим к атаке типа "человек посередине", при которой злоумышленник мог бы перехватить содержание данных при установлении повторного соединения[15].
Мандаты сессий
RFC 5077 расширяет TLS через использование мандатов сессий (англ. session tickets) вместо идентификаторов соединений (session id). Он определяет способ возобновления сеанса TLS, не требуя session id предыдущей сессии, состояние которой хранится на TLS-сервере.
При использовании сессионных мандатов TLS-сервер хранит сеансовое состояние в мандате сеанса и посылает мандат для хранения на TLS-клиенте. Клиент возобновляет TLS-сессию, отправив мандат сеанса на сервер, а сервер возобновляет TLS-сессию в соответствии с параметрами конкретной сессии, сохранёнными в принятом мандате. Сессионный мандат шифруется, в зашифрованном виде проходит аутентификацию на сервере, и сервер проверяет обоснованность мандата прежде, чем использовать его содержимое.
Одна из слабостей этого метода — для шифрования и аутентификации передаваемых сессионных мандатов всегда используется только метод AES128-CBC-SHA256, независимо от того, какие параметры TLS выбраны и используются для самого TLS-соединения[16]. Это означает, что информация о TLS-сессии (сохраняемая в сессионном мандате) не так хорошо защищена, как в рамках самой TLS-сессии. Особую озабоченность вызывает хранение OpenSSL-ключей в контексте приложения (SSL_CTX) в течение времени жизни приложения, не допуская их повторного ввода из AES128-CBC-SHA256 сессионных мандатов без сброса OpenSSL-контекста всего приложения (что редкость, подвержено ошибкам и часто требует ручного вмешательства администратора)[17][18].
Алгоритмы, использующиеся в TLS
В текущей версии протокола доступны следующие алгоритмы:
Алгоритмы могут дополняться в зависимости от версии протокола. До версии протокола TLS 1.2 были доступны также следующие алгоритмы симметричного шифрования, но они были убраны как небезопасные: RC2, IDEA, DES[19].
Сравнение с аналогами
Одной из областей применения TLS-соединения является соединение узлов в виртуальной частной сети. Кроме TLS, также могут использоваться набор протоколов IPSec и SSH-соединение. Каждый из этих подходов к реализации виртуальной частной сети имеет свои преимущества и недостатки[20].
- TLS/SSL
- Преимущества:
- Невидим для протоколов более высокого уровня;
- Популярность использования в Интернет-соединениях и приложениях электронной коммерции;
- Отсутствие постоянного соединения между сервером и клиентом;
- Позволяет создать туннель для приложений, использующих TCP, таких как электронная почта, инструменты программирования и т. д.
- Недостатки:
- Невозможность использования с протоколами UDP и ICMP;
- Необходимость отслеживания состояния соединения;
- Наличие дополнительных требований к программному обеспечению о поддержке TLS.
- IPsec
- Преимущества:
- Безопасность и надёжность защиты данных протокола проверена и доказана, так как протокол был принят как Интернет-стандарт;
- Работа в верхнем слое сетевого протокола и шифрование данных над уровнем сетевого протокола.
- Недостатки:
- Сложность реализации, создающая потенциал для уязвимостей;
- Дополнительные требования к оборудованию сети (маршрутизаторы и т. п.);
- Существует много различных реализаций, не всегда корректно взаимодействующих друг с другом.
- SSH
- Преимущества:
- Позволяет создать туннель для приложений, использующих TCP/IP, таких как электронная почта, инструменты программирования и т. д.;
- Слой безопасности невидим для пользователя.
- Недостатки:
- Трудность использования в сетях с большим числом шлюзов, таких как маршрутизаторы или брандмауэры;
- Большая нагрузка на внутрисетевой трафик;
- Невозможность использования с протоколами UDP и ICMP.
- Не имеет PKI (PKI, основанная на DNSSEC, малораспространена).
Примечания
- ↑ ГОСУДАРСТВЕННЫЙ СТАНДАРТ СТБ 34.101.65-2014
- ↑ T. Dierks, E. Rescorla. The Transport Layer Security (TLS) Protocol, Version 1.2 (неопр.) (August 2008). Архивировано 9 февраля 2012 года.; ГОСУДАРСТВЕННЫЙ СТАНДАРТ СТБ 34.101.65-2014
- ↑ The SSL Protocol: Version 3.0 Netscape’s final SSL 3.0 draft (November 18, 1996)
- ↑ Overview of SSL/TLS Encryption Microsoft TechNet. Updated July 31, 2003.
- ↑ SSL/TLS in Detail Microsoft TechNet. Updated July 31, 2003.
- ↑ Dan Goodin. Hackers break SSL encryption used by millions of sites (неопр.). The Register (19 сентября 2011). Проверено 7 декабря 2011. Архивировано 9 февраля 2012 года.
- ↑ Eric Rescorla. Understanding the TLS Renegotiation Attack (неопр.). Educated Guesswork (5 ноября 2009). Проверено 7 декабря 2011. Архивировано 9 февраля 2012 года.
- ↑ McMillan, Robert. Security Pro Says New SSL Attack Can Hit Many Sites, PC World (20 ноября 2009). Проверено 7 декабря 2011.
- ↑ SSL_CTX_set_options SECURE_RENEGOTIATION (неопр.) (недоступная ссылка). OpenSSL Docs (25 февраля 2010). Проверено 7 декабря 2010. Архивировано 9 февраля 2012 года.
- ↑ GnuTLS 2.10.0 released (неопр.). GnuTLS release notes (25 июня 2010). Проверено 7 декабря 2011. Архивировано 9 февраля 2012 года.
- ↑ NSS 3.12.6 release notes (неопр.). NSS release notes (3 марта 2010). Проверено 24 июля 2011. Архивировано 6 марта 2012 года.
- ↑ Various. IE SSL Vulnerability (неопр.) (недоступная ссылка). Educated Guesswork (10 августа 2002). Проверено 7 декабря 2010. Архивировано 9 февраля 2012 года.
- ↑ http://www.ict.kth.se/courses/IK1550/Sample-papers/2G1305_Assignment_Asa_Pehrsson_050908.pdf figure 3
- ↑ A. Pehhrson. TLS session resumption impact on HTTP performance (неопр.) (March 2008). Архивировано 9 февраля 2012 года.
- ↑ vsftpd-2.1.0 released Using TLS session resume for FTPS data connection authentication. Retrieved on 2009-04-28.
- ↑ Daignière, Florent TLS "Secrets": Whitepaper presenting the security implications of the deployment of session tickets (RFC 5077) as implemented in OpenSSL (неопр.). Matta Consulting Limited. Проверено 7 августа 2013.
- ↑ Daignière, Florent TLS "Secrets": What everyone forgot to tell you... (неопр.). Matta Consulting Limited. Проверено 7 августа 2013.
- ↑ Langley, Adam How to botch TLS forward secrecy (неопр.). imperialviolet.org (27 June 2013).
- ↑ Eric Rescorla. TLS 1.2 Update (англ.). 70 proceedings IETF. — «Other changes ... Removed RC2, DES, and IDEA». Проверено 3 января 2018.
- ↑ O. M. Dahl. Limitations and Differencies of using IPsec, TLS/SSL or SSH as VPN-solution (неопр.) (October 2004). Архивировано 9 февраля 2012 года.