Skip to content

Commit 3d0fc82

Browse files
authored
tls: Add certificate compression support (RFC 8879) (envoyproxy#42690)
Add TLS certificate compression with brotli and zlib algorithms. This reduces TLS handshake size, especially beneficial for QUIC where the ServerHello needs to fit in the initial response. The existing QUIC-only certificate compression implementation has been refactored to be shared between QUIC and TCP TLS. The QUIC wrapper now delegates to the common TLS implementation for backward compatibility. Fixes envoyproxy#42682 Signed-off-by: Doogie Min <doogie.min@sendbird.com>
1 parent 50c47e9 commit 3d0fc82

23 files changed

+568
-215
lines changed

changelogs/current.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ removed_config_or_runtime:
235235
# *Normally occurs at the end of the* :ref:`deprecation period <deprecated>`
236236

237237
new_features:
238+
- area: tls
239+
change: |
240+
Extended TLS certificate compression (RFC 8879): added brotli to QUIC (which already supported zlib),
241+
and added brotli and zlib to TCP TLS. Controlled by runtime flag
242+
``envoy.reloadable_features.tls_certificate_compression_brotli`` (defaults to ``true``).
243+
When disabled, QUIC retains zlib-only compression, while TCP TLS has no compression.
238244
- area: dynamic_modules
239245
change: |
240246
Added custom metrics (counters, gauges, histograms) support to load balancer dynamic modules.

source/common/quic/BUILD

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ envoy_cc_library(
122122
":quic_io_handle_wrapper_lib",
123123
":quic_transport_socket_factory_lib",
124124
"//envoy/ssl:tls_certificate_config_interface",
125-
"//source/common/quic:cert_compression_lib",
126125
"//source/common/quic:quic_server_transport_socket_factory_lib",
127126
"//source/common/stream_info:stream_info_lib",
128127
"//source/server:listener_stats",
@@ -504,6 +503,7 @@ envoy_cc_library(
504503
"//source/common/protobuf:utility_lib",
505504
"//source/common/quic:quic_io_handle_wrapper_lib",
506505
"//source/common/runtime:runtime_lib",
506+
"//source/common/tls:cert_compression_lib",
507507
"@quiche//:quic_core_config_lib",
508508
"@quiche//:quic_core_http_header_list_lib",
509509
"@quiche//:quic_platform",
@@ -525,12 +525,12 @@ envoy_cc_library(
525525
]),
526526
deps = envoy_select_enable_http3([
527527
":envoy_quic_proof_verifier_lib",
528+
":envoy_quic_utils_lib",
528529
"//envoy/network:transport_socket_interface",
529530
"//envoy/server:transport_socket_config_interface",
530531
"//envoy/ssl:context_config_interface",
531532
"//source/common/common:assert_lib",
532533
"//source/common/network:transport_socket_options_lib",
533-
"//source/common/quic:cert_compression_lib",
534534
"//source/common/tls:client_ssl_socket_lib",
535535
"//source/common/tls:context_config_lib",
536536
"@quiche//:quic_core_crypto_crypto_handshake_lib",
@@ -730,16 +730,3 @@ envoy_cc_library(
730730
"@quiche//:quic_core_types_lib",
731731
]),
732732
)
733-
734-
envoy_cc_library(
735-
name = "cert_compression_lib",
736-
srcs = envoy_select_enable_http3(["cert_compression.cc"]),
737-
hdrs = envoy_select_enable_http3(["cert_compression.h"]),
738-
external_deps = ["ssl"],
739-
deps = envoy_select_enable_http3([
740-
"//bazel:zlib",
741-
"//source/common/common:assert_lib",
742-
"//source/common/common:logger_lib",
743-
"//source/common/runtime:runtime_lib",
744-
]),
745-
)

source/common/quic/cert_compression.cc

Lines changed: 0 additions & 129 deletions
This file was deleted.

source/common/quic/cert_compression.h

Lines changed: 0 additions & 31 deletions
This file was deleted.

source/common/quic/envoy_quic_proof_source.cc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44

55
#include "envoy/ssl/tls_certificate_config.h"
66

7-
#include "source/common/quic/cert_compression.h"
87
#include "source/common/quic/envoy_quic_utils.h"
98
#include "source/common/quic/quic_io_handle_wrapper.h"
10-
#include "source/common/runtime/runtime_features.h"
119
#include "source/common/stream_info/stream_info_impl.h"
1210

1311
#include "openssl/bytestring.h"
@@ -115,9 +113,7 @@ void EnvoyQuicProofSource::updateFilterChainManager(
115113
filter_chain_manager_ = &filter_chain_manager;
116114
}
117115

118-
void EnvoyQuicProofSource::OnNewSslCtx(SSL_CTX* ssl_ctx) {
119-
CertCompression::registerSslContext(ssl_ctx);
120-
}
116+
void EnvoyQuicProofSource::OnNewSslCtx(SSL_CTX* ssl_ctx) { registerCertCompression(ssl_ctx); }
121117

122118
} // namespace Quic
123119
} // namespace Envoy

source/common/quic/envoy_quic_utils.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "source/common/protobuf/utility.h"
2828
#include "source/common/quic/quic_io_handle_wrapper.h"
2929
#include "source/common/runtime/runtime_features.h"
30+
#include "source/common/tls/cert_compression.h"
3031

3132
#include "absl/numeric/int128.h"
3233
#include "absl/strings/str_cat.h"
@@ -444,5 +445,13 @@ quic::QuicEcnCodepoint getQuicEcnCodepointFromTosByte(uint8_t tos_byte) {
444445
return static_cast<quic::QuicEcnCodepoint>(tos_byte & kEcnMask);
445446
}
446447

448+
void registerCertCompression(SSL_CTX* ssl_ctx) {
449+
if (Runtime::runtimeFeatureEnabled(
450+
"envoy.reloadable_features.tls_certificate_compression_brotli")) {
451+
Extensions::TransportSockets::Tls::CertCompression::registerBrotli(ssl_ctx);
452+
}
453+
Extensions::TransportSockets::Tls::CertCompression::registerZlib(ssl_ctx);
454+
}
455+
447456
} // namespace Quic
448457
} // namespace Envoy

source/common/quic/envoy_quic_utils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,5 +221,8 @@ void configQuicInitialFlowControlWindow(const envoy::config::core::v3::QuicProto
221221
// Extract the two ECN bits from the TOS byte in the IP header.
222222
quic::QuicEcnCodepoint getQuicEcnCodepointFromTosByte(uint8_t tos_byte);
223223

224+
// Register TLS certificate compression algorithms (RFC 8879) for QUIC.
225+
void registerCertCompression(SSL_CTX* ssl_ctx);
226+
224227
} // namespace Quic
225228
} // namespace Envoy

source/common/quic/quic_client_transport_socket_factory.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44

55
#include "envoy/extensions/transport_sockets/quic/v3/quic_transport.pb.validate.h"
66

7-
#include "source/common/quic/cert_compression.h"
87
#include "source/common/quic/envoy_quic_proof_verifier.h"
9-
#include "source/common/runtime/runtime_features.h"
8+
#include "source/common/quic/envoy_quic_utils.h"
109
#include "source/common/tls/context_config_impl.h"
1110

1211
#include "quiche/quic/core/crypto/quic_client_session_cache.h"
@@ -92,7 +91,7 @@ std::shared_ptr<quic::QuicCryptoClientConfig> QuicClientTransportSocketFactory::
9291
std::make_unique<Quic::EnvoyQuicProofVerifier>(std::move(context), accept_untrusted),
9392
std::make_unique<quic::QuicClientSessionCache>());
9493

95-
CertCompression::registerSslContext(tls_config.crypto_config_->ssl_ctx());
94+
registerCertCompression(tls_config.crypto_config_->ssl_ctx());
9695
}
9796
// Return the latest crypto config.
9897
return tls_config.crypto_config_;

source/common/runtime/runtime_features.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ RUNTIME_GUARD(envoy_reloadable_features_skip_dns_lookup_for_proxied_requests);
9292
RUNTIME_GUARD(envoy_reloadable_features_tcp_proxy_odcds_over_ads_fix);
9393
RUNTIME_GUARD(envoy_reloadable_features_tcp_proxy_set_idle_timer_immediately_on_new_connection);
9494
RUNTIME_GUARD(envoy_reloadable_features_test_feature_true);
95+
RUNTIME_GUARD(envoy_reloadable_features_tls_certificate_compression_brotli);
9596
RUNTIME_GUARD(envoy_reloadable_features_trace_refresh_after_route_refresh);
9697
RUNTIME_GUARD(envoy_reloadable_features_udp_set_do_not_fragment);
9798
RUNTIME_GUARD(envoy_reloadable_features_uhv_allow_malformed_url_encoding);

source/common/tls/BUILD

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ envoy_cc_library(
182182
# TLS is core functionality.
183183
visibility = ["//visibility:public"],
184184
deps = [
185+
":cert_compression_lib",
185186
":stats_lib",
186187
":utility_lib",
187188
"//envoy/ssl:context_config_interface",
@@ -259,3 +260,18 @@ envoy_cc_library(
259260
"//source/common/network:address_lib",
260261
],
261262
)
263+
264+
envoy_cc_library(
265+
name = "cert_compression_lib",
266+
srcs = ["cert_compression.cc"],
267+
hdrs = ["cert_compression.h"],
268+
external_deps = ["ssl"],
269+
deps = [
270+
"//bazel:zlib",
271+
"//envoy/ssl:context_config_interface",
272+
"//source/common/common:assert_lib",
273+
"//source/common/common:logger_lib",
274+
"@brotli//:brotlidec",
275+
"@brotli//:brotlienc",
276+
],
277+
)

0 commit comments

Comments
 (0)