TLS (transport layer security) – протокол для безопасного обмена данными между браузером пользователя и сервером. TLS обеспечивает следующие меры безопасности:
- Конфиденциальность. Шифрует всю передаваемую информацию, что делает невозможным её прочтение при перехвате. Для шифрования используются симметричные алгоритмы.
- Аутентификация. Подтверждает авторство информации и гарантирует, что обмен данными проходит между теми узлами, для которых изначально был организован защищенный канал.
- Контроль целостности. Проверяет получаемую информации на предмет возможной подмены или искажения. Для контроля целостности сообщений используются односторонние функции (хеш-функции).
Шаги установки TLS-соединения между браузером и сервером
Инициатором TLS-соединения выступает браузер (далее – клиент), который обращается к серверу по специальному порту (например, порт 443 для HTTPS). Затем клиент и сервер начинают обмениваться handshake-сообщениями для согласования параметров защищенного канала связи.
- Клиент отправляет сообщение ClientHello, содержащее версию протокола TLS и список поддерживаемых шифронаборов.
- Сервер отвечает сообщением ServerHello, содержащим подтверждение версии протокола TLS и выбранный шифронабор из предложенного клиентом списка.
- Сервер отправляет сообщение Certificate для собственной аутентификации. Оно содержит серверный сертификат с открытым ключом электронной подписи и промежуточные сертификаты удостоверяющих центров.
- Сервер отправляет сообщение ServerKeyExchange, содержащее параметры для вычисления общего сеансового ключа, которым будет шифроваться поток данных. Этот ключ будет вычислен клиентом и сервером по протоколу Диффи-Хеллмана без какого-либо обмена секретными данными по ещё незащищенному каналу.
- Сервер отправляет пустое сообщение ServerHelloDone, оповещая клиент об окончании своей части обмена начальными данными.
- Клиент удостоверяется в надежности полученного серверного сертификата и отправляет серверу сообщение ClientKeyExchange, содержащее клиентскую часть параметров для вычисления общего сеансового ключа по протоколу Диффи-Хеллмана.
- Клиент отправляет сообщение ChangeCipherSpec, которое означает, что сеансовый ключ вычислен, клиентская сторона готова к обмену зашифрованными данными, и последующие сообщения клиента будут шифроваться сеансовым ключом по ранее согласованному алгоритму.
- Клиент вычисляет значение хэш-функции от всех предыдущий handshake-сообщений, шифрует его сеансовым ключом и передает серверу в сообщении Finished.
- Сервер также вычисляет значение хэш-функции от всех handshake-сообщений и сравнивает с хэшем из клиентского сообщения Finished. Если значения хэш-функций совпадают, то сервер делает вывод, что от клиента получено криптографически стойкое подтверждение о согласовании параметров соединения.
- Сервер отправляет сообщение ChangeCipherSpec, которое означает, что серверная сторона тоже готова к обмену зашифрованными данными, и последующие сообщения сервера будут шифроваться сеансовым ключом по ранее согласованному алгоритму.
- Сервер вычисляет значение хэш-функции от всех предыдущих handshake-сообщений, шифрует его сеансовым ключом и отправляет клиенту в сообщении Finished.
- Клиент вычисляет значение хэш-функции от всех handshake-сообщений и сравнивает с хэшем из серверного сообщения Finished. Если значения хэш-функций совпадают, то клиент делает вывод, что от сервера тоже получено криптографически стойкое подтверждение о согласовании параметров соединения.
Теперь соединение по протоколу TLS установлено, и браузер готов обмениваться с сервером данными в защищенной форме.