2.3. Аутентификация по сертификатам

Большинство современных приложений состоят из клиентов (браузеров, смартфонов) и серверов, где хранятся отправленные клиентами данные. А значит, нужны системы, гарантирующие, что доступ к сохранённым данным будет предоставлен только пользователю, которому они принадлежат.

Термин «аутентификация» применяется для описания потока данных, который позволяет системе идентифицировать пользователя. Другими словами, системы аутентификации дают понять, что Ivan123 на самом деле Ivan123, а не King1986.

Термин «авторизация» используют для описания процесса внутри системы, с помощью которого пользователь может подтвердить право на доступ к определённым ресурсам. Например, у Ivan123 должен быть доступ только к тем личным фото, которые он сам загрузил. Для King1988 эти фотографии должны быть недоступны. Оба процесса имеют решающее значение для контроля безопасности работы веб-приложений.

Как отправляются данные

Давайте рассмотрим процесс безопасной отправки данных с помощью TLS с одного компьютера на другой. Передающий компьютер мы будем называть клиентом, а принимающий — сервером.

«Рукопожатие» TCP

Поскольку TLS построен поверх TCP/IP, клиент должен сначала завершить трёхстороннее установление связи TCP с сервером. Этот процесс мы уже рассматривали:

Трёхстороннее установление связи TCP с сервером

Первый компьютер отправляет пакет с битом SYN (SYN = «Синхронизировать?»). Второй компьютер отправляет обратно пакет с битом ASK (ASK = «Подтвердить!») Плюс бит SYN. Первый компьютер отвечает ASK. Три пакета, участвующие в тройном «рукопожатии», обычно не содержат никаких данных. После завершения «рукопожатия» компьютеры готовы принимать пакеты, содержащие фактические данные.

Что же происходит дальше для установления безопасного соединения?

Инициирование TLS

Клиент должен предупредить сервер о том, что ему требуется соединение TLS вместо стандартного небезопасного соединения. Поэтому он отправляет сообщение с описанием версии протокола TLS, а также предпочитаемые методы шифрования:

Инициирование TLS

Сервер подтверждает протокол

Сервер прервёт соединение, если он не поддерживает запрошенные клиентом технологии. Это может произойти, если современный клиент пытается связаться со старым сервером.

Если сервер поддерживает запрошенную версию протокола TLS и другие параметры, он ответит подтверждением, SSL-сертификатом (Private Key) и открытым ключом (Public Key).

Сервер подтверждает протокол

Проверка сертификата

SSL-сертификат сервера — это способ сервера сказать: «Да, я действительно тот, кем вы меня считаете». Если клиент не верит в подлинность сертификата, он прервёт соединение, поскольку не хочет отправлять личные данные самозванцу. Но если клиент успешно проверил сертификат, он переходит к следующему шагу.

Проверка сертификата

Генерация общего ключа

В этот момент клиенту уже известен открытый ключ сервера. Теперь он может зашифровать данные при помощи открытого ключа, а затем сервер может расшифровать их с помощью SSL-ключа.

Шифрование с открытым ключом занимает гораздо больше времени, чем симметричное шифрование. Симметричное шифрование — это когда один и тот же ключ используется для шифрования и дешифрования. Это происходит из-за более сложных арифметических операций. По возможности предпочитают использовать симметричное шифрование для экономии времени.

Компьютеры могут сначала использовать шифрование с открытым ключом, чтобы в частном порядке сгенерировать общий ключ, а затем они могут использовать симметричное шифрование с этим ключом в будущих сообщениях. Точный метод генерации ключа зависит от выбранного шифронабора. Самые распространённые из них — RSA и Диффи-Хеллман.

Клиент начинает процесс с отправки сообщения на сервер с предварительным ключом (Pre-Master Secret), зашифрованным открытым ключом сервера. Клиент вычисляет общий ключ на основе этого предварительного ключа (поскольку это более безопасно, чем отправка фактического общего ключа) и запоминает общий ключ локально.

Клиент также отправляет сообщение «Готово», содержимое которого зашифровано с помощью общего ключа.

Генерация общего ключа

Сервер подтверждает общий ключ

Теперь сервер может вычислить общий ключ на основе предварительного общего ключа и попытаться расшифровать сообщение «Готово» с помощью этого ключа. В случае сбоя соединение прерывается.

Если сервер расшифровал сообщение клиента с помощью общего ключа, он отправляет подтверждение и собственное сообщение «Готово» с зашифрованным содержимым.

Сервер подтверждает общий ключ

Отправка защищённых данных

Теперь клиент при помощи симметричного шифрования и общего ключа безопасно отправляет личные данные на сервер.

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

Отправка защищённых данных

Если вы хотите посмотреть подробнее, какие данные отправляется в каждом из шагов, посмотрите проект The Illustrated TLS Connection.

Подведём итог

SSL/TLS используется для многих форм безопасного обмена данными в интернете, таких как отправка электронной почты и загрузка файлов. Тем не менее он наиболее известен своим использованием при безопасном просмотре веб-сайтов (HTTPS).

SSL/TLS обеспечивает уровень безопасности поверх TCP/IP благодаря использованию как открытого ключа, так и симметричного шифрования. Он становится всё более необходимым для защиты частных данных при передаче через интернет.