TLS (transport layer security) – протокол, обеспечивающий защиту данных при передаче через интернет. Целью протокола является установление защищённого соединения между клиентом и сервером, а именно:

  1. Шифрование соединения: никто не может читать сообщения, кроме сервера и клиента
  2. Проверка целостности сообщений: никто не может подменить сообщения
  3. Проведение аутентификации: сервер и клиент уверены, что общаются именно друг с другом

Основная идея

Клиент (например, ваш браузер) и сервер (например, сайт, который вы открываете) хотят установить защищённое соединение. Для этого им нужно пройти процедуру Handshake (рукопожатие):

  1. Установить сетевое соединение
  2. Договориться об используемых параметрах: алгоритмы шифрования, подписи и т.п. Такие наборы алгоритмов называются криптонаборами
  3. Выработать общий секрет

Далее клиент и сервер могут обмениваться защищёнными сообщениями.

image
Общая схема TLS

TLS 1.2

Основной протокол

image
Handshake TLS 1.2

Клиент: ClientHello
Это первое сообщение, которое означает начало взаимодействия. Клиент передаёт версию протокола и поддерживаемые криптонаборы в порядке предпочтения.

Сервер: ServerHello
Сервер отвечает выбранным криптонабором.

Сервер: Certificate
Сервер высылает свой сертификат и цепочку промежуточных сертификатов для проверки Подробно о сертификатах.

Сервер: ServerKeyExchange
Посылается, если одного сертификата недостаточно для генерации ключа. Содержит другие необходимые параметры, например, параметры Диффи-Хеллмана.

Сервер: ServerHelloDone
Сигнал от сервера о том, что он закончил ответ и ждёт данных от клиента.

Клиент: ClientKeyExchange
Клиентская часть данных для генерации секрета. Есть два основных варианта:

  1. Клиент генерирует общий ключ и шифрует его с помощью сертификата сервера. Сервер расшифровывает сообщение на своём секретном ключе и получает общий ключ
  2. Клиент высылает свои параметры Диффи-Хеллмана. Далее клиент и сервер генерируют общий ключ по протоколу Диффи-Хеллмана

Клиент: ChangeCipherSpec
Сигнал клиента о том, что все последующие сообщения будут зашифрованы.

Клиент: Finished
Первое защищённое сообщение. Клиент сообщает, что закончил Handshake. Сообщение содержит хеш (HMAC) всех предыдущих сообщений Handshake, которые были до этого. Так сервер проверяет целостность всех сообщений Handshake и убеждается, что и у него, и у клиента были одни и те же сообщения, их никто не подменил.

Сервер: ChangeCipherSpec
Сигнал сервера о том, что все последующие сообщения будут зашифрованы.

Сервер: Finished
Аналогично сообщения Finished клиента: сервер сообщает, что закончил Handshake и посылает хеш всех предыдущих сообщений (в том числе полученного от клиента Finished).

Дополнительные возможности

Сертификат клиента. После отправки своего сертификата сервер может потребовать сертификат клиента для дополнительной аутентификации клиента. Для этого используются сообщения CertificateRequest и CertificateVerify.

Упрощённое восстановление сессии. Установление соединения TLS – многоступенчатый и довольно долгий (по меркам компьютерных сетей) процесс. Поэтому если клиент и сервер уже устанавливали соединение, то существует упрощённая версия протокола восстановления соединения, используя прошлые результаты для экономии времени.

TLS 1.3

Недостатки TLS 1.2

У протокола TLS 1.2 есть несколько недостатков:

  1. Требуется много сообщений, что влияет на время процедуры
  2. Практически все сообщения пересылаются в открытом виде

Протокол TLS 1.3 разработан чтобы решить эти проблемы. По сравнению с TLS 1.2 уменьшено общее количество сообщений, практически сразу клиент и сервер начинают общаться зашифрованными сообщениями, а также сокращён список криптонаборов, чтобы исключить устаревшие и ненадёжные.

Основной протокол

image
Handshake TLS 1.3

Клиент: ClientHello
Как и TLS 1.2 клиент начинает взаимодействие. В этом сообщении клиент сразу передаёт параметры Диффи-Хеллмана, а также список криптонаборов.

Сервер: ServerHello
Сервер посылает выбранный криптонабор и свой набор параметров Диффи-Хеллмана. Это последние сообщение, которое передаётся в открытом виде. Все последующие сообщения зашифрованы, так как сервер и клиент уже могут сгенерировать общий секрет по протоколу Диффи-Хеллмана.

Сервер: EncryptedExtensions
В этом сообщений посылается вся дополнительная информация, необходимая для генерации ключей, которую можно передавать в зашифрованном виде. Часто сообщение пустое.

Сервер: Certificate
Сертификат сервера. Обратите внимание, что в TLS 1.3 в отличие от 1.2 сертификат передаётся в зашифрованном виде.

Сервер: CertificateVerify
Подпись сервером всего набора сообщений Handshake на текущий момент. Выполняет две цели:

  1. Сервер подтверждает, что он действительно владеет секретным ключом от сертификата
  2. Позволяет проверить целостность сообщений

Клиент и Сервер Finished
Совпадают с сообщением Finished в TLS 1.2

Подробнее

Протокол TLS содержит много тонкостей. Если хотите разобраться подробнее:

  1. Отличный сайт с наглядным разбором всех пакетов, исходник на гитхабе
  2. Полное описание протоколов содержится в спецификациях RFC: RFC 5246 (TLS 1.2) и RFC 8446 (TLS 1.3)
📢тг-канал