Кратко

  • RFC 8879 разрешает в TLS 1.3 заменить Certificate на CompressedCertificate, когда принимающая сторона заранее перечислила алгоритмы распаковки. Это разрешение на представление, а не доказательство использования и не неограниченный ресурсный мандат.
  • uncompressed_length обязан точно совпасть с длиной восстановленного сообщения, а вывод не может выйти за это значение. Получатель вправе установить предел ниже 24-битного потолка TLS ещё до того, как сертификат сможет подтвердить peer.
  • Успешная распаковка не равна валидации. Доказательства отдельно фиксируют предложение, выбор, сжатые байты, объявленную и реальную длину, hash восстановления, разобранную цепочку, решение доверия, alert, fallback и транспортный итог.

Сначала решается вопрос ресурсов

TLS terminator принимает тысячи новых соединений. Клиент перечислил zlib, Brotli и Zstandard в ClientHello. Сервер выбрал Brotli и прислал маленький CompressedCertificate, объявив двенадцать мегабайт исходного Certificate.

Данные, способные подтвердить сервер, всё ещё скрыты. Клиент не может использовать CA, имя или public key для оправдания первой аллокации. Он сначала проверяет собственное предложение, применяет обычный лимит Certificate, ограничивает decoder и требует точного совпадения длины.

Так сохраняется локальная власть. Отправитель выбирает представление из разрешённого набора. Получатель решает, какие transforms выполнять и какую нагрузку может потребовать ещё не аутентифицированное соединение. Поддержка Brotli не означает передачу планирования памяти.

TLS framing допускает 16 777 215 байт, но RFC разрешает более низкий предел реализации. Одна граница должна действовать на сжатом и обычном пути. Сообщение, слишком большое без сжатия, не получает доступ к parser благодаря маленькой оболочке.

Предложение, выбор и результат нельзя смешивать

compress_certificate направлен в одну сторону. В ClientHello клиент описывает алгоритмы для сертификата сервера; в CertificateRequest сервер описывает приём сертификата клиента. Подтверждающего response extension нет.

Отправитель может выбрать предложенный алгоритм или послать обычный Certificate. Поэтому extension 27 в trace не доказывает последующую handshake message 25. Offer counter измеряет объявленную способность, selection counter — исполнение, но ни один не доказывает восстановление и проверку.

Направления тоже независимы. Клиент, принимающий сжатую цепочку сервера, не обязательно умеет сжимать свою. Library build может включать только RX, только TX или разные множества алгоритмов.

Механизм работает с TLS 1.3 и новее; в TLS 1.2 extension игнорируется. Это не общая компрессия TLS records. Меняется представление одной handshake message, после чего обычная обработка сертификата остаётся обязательной.

Сжимается точное кодированное сообщение

Входом служат не PEM-файлы и не отдельные X.509. Сжимается полное Certificate с request context, списком и extensions каждой entry. Если другой extension меняет message, эти байты также входят в input.

Поэтому нужны два уровня hashes. Первый идентифицирует алгоритм, header и полученный payload. Второй — точные байты восстановленного Certificate. Fingerprints leaf и intermediate затем показывают объекты, рассмотренные chain validation.

Разные алгоритмы дают разные representations одного input. Обновление библиотеки также способно изменить compressed payload при неизменном output. Один hash сжатых байтов не доказывает логическую эквивалентность zlib, Brotli, Zstandard и обычного пути.

Предварительное сжатие подчинено той же связи. OpenSSL умеет хранить compressed server certificates, а client Certificate создаётся по запросу из-за уникального context от сервера. Cache должен быть привязан ко всему message: новая chain, другой intermediate или extension делают старый artifact неверным.

Объявленная длина — предохранитель

Ошибка decoder, выход сверх декларации или несовпадение итоговой длины приводят к bad_certificate. Ограничение действует в ходе вывода, а не после расходования памяти.

Поле помогает раннему отказу, но не удостоверяет отправителя и не гарантирует правильную структуру. Разрешённая протоколом величина может быть чрезмерной для конкурентного сервиса. Локальный предел выводится из измерений памяти, CPU и параллельности.

Сжатие не обязано уменьшать. Тесты BoringSSL намеренно включают shrinking, expanding и random transforms. Валидность означает точное восстановление в пределах границы; меньший payload — цель оптимизации.

Отдельно измеряют декларацию, результат, peak allocation, decoder time и failure class. Высокий ratio может скрыть давление на память, а умеренный — сэкономить критичный packet. Процент сам по себе не доказывает безопасность или latency.

Доверие оценивается после восстановления

Восстановленный Certificate обрабатывается как обычный: parsing, построение chain, проверка имени и времени, локальная policy и CertificateVerify в TLS 1.3 transcript. Компрессия не исправляет неизвестную CA или неверную подпись.

Причины отказа остаются раздельными. Не предложенный алгоритм — negotiation. Overrun, decoder или length mismatch — reconstruction. Неверная структура — parsing. Chain и имя — validation. CertificateVerify — handshake authentication.

Общий certificate_error стирает место решения. decompression_success как метрика безопасности столь же ложен: ожидаемая identity, possession of key и application authorization ещё не доказаны.

Running code показывает последовательность. BoringSSL строит обычный Certificate и длину, вызывает выбранный callback и сериализует сжатое сообщение; tests проверяют аномалии. OpenSSL разделяет RX, TX, preferences и server precompression. IANA registry, доступный код и активная конфигурация — разные свидетельства.

Экономия имеет смысл только вместе с исходом

Chain часто занимает большую часть первого handshake. Меньше bytes могут сократить packets или один round trip, но результат зависит от chain, congestion window, loss, CPU, cache и общего алгоритма. Размер PEM на диске не заменяет длину encoded Certificate.

Связать offer, direction, algorithm, размеры, records, packets, retransmissions, CPU, memory, validation и итоговое время. Контроль использует ту же certificate identity и policy без сжатия.

При отсутствии общего алгоритма обычный Certificate — штатный fallback. Его рост может означать новый client mix, build без decoder или перенос TLS termination. Одинаковый лимит и validation делают это сменой представления, а не downgrade доверия.

Источники