Skip to content

10.2.x: HTTP/3 via OpenSSL QUIC - #13463

Merged
cmcfarlen merged 2 commits into
apache:10.2.xfrom
bneradt:openssl35-native-quic-support-10.2.x
Jul 31, 2026
Merged

10.2.x: HTTP/3 via OpenSSL QUIC#13463
cmcfarlen merged 2 commits into
apache:10.2.xfrom
bneradt:openssl35-native-quic-support-10.2.x

Conversation

@bneradt

@bneradt bneradt commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

OpenSSL 3.5 can terminate QUIC connections directly, but ATS only had a
quiche-backed HTTP/3 listener. Operators who want to use the system
OpenSSL QUIC stack needed a separate downstream backend without changing
the existing quiche path or origin HTTP/3 scope.

This adds an optional ENABLE_OPENSSL_QUIC backend that uses OpenSSL's
native QUIC listener and stream APIs for downstream HTTP/3. This keeps
the backend mutually exclusive with quiche, exposes TS_HAS_OPENSSL_QUIC,
and shares ATS's existing HTTP/3 stream handling above the transport.

This also installs native-QUIC TLS callbacks for ALPN and SNI
certificate selection before ATS has a QUIC NetVC to bind. OpenSSL
native QUIC does not make a selected SSL_CTX certificate active via
SSL_set_SSL_CTX alone, so this applies the selected cert, key, and chain
to the connection SSL.

This also broadens client-side HTTP/3 tests to run with either backend,
keeps H3 streams open across informational responses, and hardens
transaction cleanup when OpenSSL closes stream state before ATS finishes
teardown. This caches stream identifiers, declines listener-time QUIC
tickets until a NetVC is bound, and adds focused H3 lifecycle and
session-ticket coverage.

Copilot AI review requested due to automatic review settings July 30, 2026 23:14
@bneradt bneradt added this to the 10.2.0 milestone Jul 30, 2026
@bneradt bneradt added HTTP/2 TLS Tests Backport Marked for backport for an LTS patch release QUIC HTTP/3 10.2.x labels Jul 30, 2026
@bneradt bneradt self-assigned this Jul 30, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@bneradt bneradt changed the title HTTP/3 via OpenSSL QUIC 10.2.x: HTTP/3 via OpenSSL QUIC Jul 30, 2026
@bneradt
bneradt force-pushed the openssl35-native-quic-support-10.2.x branch from b95ec0b to 5683a7e Compare July 31, 2026 16:08
bneradt added 2 commits July 31, 2026 11:14
Fedora now ships OpenSSL 3.5 with the third-party QUIC TLS
callback API, but quiche still links against the older
quictls/BoringSSL symbols. ATS therefore could not use the system
OpenSSL library for downstream HTTP/3 without dragging in a different
TLS stack.

This adds CMake detection for the OpenSSL callback API and provides a
private compatibility layer that maps quiche's legacy hooks onto
SSL_set_quic_tls_cbs. This requires static quiche in that mode so ATS
resolves the shim symbols locally and links the final binaries against
the system OpenSSL libraries.

This also relaxes verifier-only HTTP/3 AuTest gates that do not execute
curl, so those tests can run when ATS has QUIC support but the installed
curl lacks HTTP/3.

Unknown unidirectional HTTP/3 stream types and aliased frame-type
interests also exposed gaps in shared H3 handling. This discards ignored
stream data and de-duplicates handler registration so buffered input
does not grow indefinitely and MAX_PUSH_ID handlers run once.
OpenSSL 3.5 can terminate QUIC connections directly, but ATS only had a
quiche-backed HTTP/3 listener. Operators who want to use the system
OpenSSL QUIC stack needed a separate downstream backend without changing
the existing quiche path or origin HTTP/3 scope.

This adds an optional ENABLE_OPENSSL_QUIC backend that uses OpenSSL's
native QUIC listener and stream APIs for downstream HTTP/3. This keeps
the backend mutually exclusive with quiche, exposes TS_HAS_OPENSSL_QUIC,
and shares ATS's existing HTTP/3 stream handling above the transport.

This also installs native-QUIC TLS callbacks for ALPN and SNI
certificate selection before ATS has a QUIC NetVC to bind. OpenSSL
native QUIC does not make a selected SSL_CTX certificate active via
SSL_set_SSL_CTX alone, so this applies the selected cert, key, and chain
to the connection SSL.

This also broadens client-side HTTP/3 tests to run with either backend,
keeps H3 streams open across informational responses, and hardens
transaction cleanup when OpenSSL closes stream state before ATS finishes
teardown. This caches stream identifiers, declines listener-time QUIC
tickets until a NetVC is bound, and adds focused H3 lifecycle and
session-ticket coverage.
@bneradt
bneradt force-pushed the openssl35-native-quic-support-10.2.x branch from 5683a7e to 8eabddc Compare July 31, 2026 16:14
@cmcfarlen
cmcfarlen merged commit 939915e into apache:10.2.x Jul 31, 2026
15 checks passed
@github-project-automation github-project-automation Bot moved this to For v10.2.0 in ATS v10.2.x Jul 31, 2026
@cmcfarlen cmcfarlen moved this from For v10.2.0 to Picked v10.2.0 in ATS v10.2.x Aug 4, 2026
@cmcfarlen

Copy link
Copy Markdown
Contributor

Landed directly on the 10.2.x branch as 939915e for the 10.2.0 release (this PR was merged against 10.2.x, so no cherry-pick was needed).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

10.2.x Backport Marked for backport for an LTS patch release HTTP/2 HTTP/3 QUIC Tests TLS

Projects

Status: Picked v10.2.0

Development

Successfully merging this pull request may close these issues.

3 participants