Зачем в TLS два вида шифрования, если асимметричное и так работает
Асимметричное шифрование решает главную проблему — как договориться о секрете по открытому каналу, не имея общего ключа заранее. Но RSA или обмен по эллиптическим кривым (ECDHE) в разы медленнее симметричного AES. Гонять им весь трафик сессии — не вариант под нагрузкой.
Поэтому хендшейк решает одну задачу: асимметричной криптографией стороны договариваются об общем симметричном ключе, а дальше весь трафик идёт через AES.
Упрощённо для TLS 1.3: клиент отправляет свои параметры ключевого обмена (ключевой share на эллиптической кривой), сервер отвечает своим share, сертификатом и подписью. Обе стороны независимо вычисляют один и тот же общий секрет через ECDHE, из него выводят ключи сессии — и дальше шифруют AES-GCM.
// На уровне приложения это скрыто, // но именно отсюда растёт разница // в задержке между http и https SSLContext ctx = SSLContext.getInstance("TLSv1.3");
Спросят: сколько round-trip'ов занимает хендшейк в TLS 1.2 против TLS 1.3. В 1.2 — два RTT до первого прикладного байта, в 1.3 — один RTT, а при session resumption (0-RTT) можно отправить данные вместе с первым сообщением клиента, но с риском replay-атаки на эти данные.
Сертификат в хендшейке не шифрует трафик — он доказывает, что публичный ключ принадлежит серверу, которому вы доверяете. Шифрует симметричный ключ, рождённый из обмена.
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки