awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

TLS 1.3: чтение трасс и конфигов

Суть Читай реальный вывод openssl s_client, конфиг ticket-ключа Nginx, обработчик Early-Data и трассу key_share, затем выбирай диагноз и самое рычажное исправление.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Проблемы TLS диагностируются в трассах handshake, конфигах сервера и заголовках запросов — а не в учебных схемах. Прочитай каждый артефакт, предскажи поведение и выбери исправление, которое senior-инженер сделает первым.

Цель

Отработай цикл, который ты запускаешь в каждом инциденте TLS: прочитай вывод openssl или конфиг, найди нарушенный инвариант handshake и потянись за самым рычажным исправлением.

Сниппет 1 — проверка цепочки в openssl s_client

% openssl s_client -connect api.example.com:443 -tls1_3
depth=0 CN = api.example.com
verify error:num=20:unable to get local issuer certificate
verify error:num=21:unable to verify the first certificate
---
Certificate chain
 0 s:CN = api.example.com
   i:CN = R3 Issuing CA
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Verify return code: 21 (unable to verify the first certificate)
Викторина

Handshake завершается и cipher согласован, но verify return code равен 21. Что сконфигурировано неверно?

Сниппет 2 — конфиг ticket-ключа сессии в Nginx

server {
    listen 443 ssl;
    ssl_protocols TLSv1.3;
    ssl_session_ticket_key /etc/nginx/ticket.key;   # generated once at install
    ssl_early_data on;
    # ...
}
Викторина

Этот конфиг работает без изменений год. Каков самый серьёзный дефект безопасности, учитывая, что ssl_early_data включён?

Сниппет 3 — обработчик запроса Early-Data

app.post("/transfer", (req, res) => {
  // money movement
  if (req.headers["early-data"] === "1") {
    // request arrived in TLS 0-RTT early data
  }
  doTransfer(req.body);
  res.send("ok");
});
Викторина

Заголовок Early-Data читается, но обработчик всё равно вызывает doTransfer в любом случае. Что пойдёт не так при replay и каково верное исправление?

Сниппет 4 — трасса клиентского key_share

ClientHello key_share: x25519 (0x001d), X25519MLKEM768 (0x11ec)
ServerHello: HelloRetryRequest, selected_group = secp256r1 (0x0017)
Викторина

Клиент предложил x25519 и гибридный X25519MLKEM768, но сервер прислал HelloRetryRequest с запросом secp256r1. Что произошло и какова цена?

Итог

Каждый инцидент TLS читается в артефактах: код verify 20/21 в openssl означает неполную цепочку — отправь intermediate; статичный лежащий на диске ssl_session_ticket_key разрушает forward secrecy возобновления — ротируй STEK ежечасно в памяти; обработчик Early-Data, который мутирует без возврата 425 Too Early, поддаётся replay — гейти изменяющие маршруты по заголовку Early-Data; а HelloRetryRequest с именем другой группы означает, что предложенные key_share не попали — предлагай x25519 плюс P-256 сразу, чтобы избежать лишнего RTT. Прочитай артефакт, найди нарушенный инвариант, исправь причину.

Продолжить восхождение ↑TLS 1.3: собери и сломай закалённый эндпоинт
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.