mod_http3 0.0.53 for Apache httpd 2.4.68 is available for testing

Experimental mod_http3 0.0.53 packages are now available in the CodeIT testing repository for EL7, EL8, EL9 and EL10.

The module requires our patched httpd 2.4.68-2 package, which includes MPM changes required for externally managed QUIC connections.

HTTP/3 support remains experimental. Use these packages on testing systems before considering production deployment.

Changes

*) Rejected malformed HTTP/3 requests (missing or duplicate pseudo-header fields, connection-specific fields, content-length mismatch) with a stream error of type H3_MESSAGE_ERROR per RFC 9114 4.1.2. Previously one malformed request closed the whole QUIC connection, ending every other request in flight on it.
[Alexander Gerasimov]

*) Added support for building against httpd 2.4.52+. Without response buckets the module removes the core HTTP_HEADER filter from its requests and snapshots status and headers itself, mirroring mod_http2’s !AP_HAS_RESPONSE_BUCKETS path.
[Alexander Gerasimov]

*) Made the MPM connection-count notifications optional. Stock 2.4.x MPMs do not provide them; the module then runs in a degraded mode where a graceful child stop does not wait for active QUIC connections to drain. The patch in .patches/httpd-2.4.66-pr699.patch adds the notifications to httpd 2.4.x.
[Alexander Gerasimov]

*) Enforced H3IdleTimeout in the module’s own event loop. The QUIC stacks keep an otherwise idle connection alive by themselves — OpenSSL sends a keepalive PING at half the idle interval to hold NAT state open — which resets both endpoints’ idle timers, so the transport timeout never fired and a finished connection held its session pool and its H3MaxConnections slot until the client went away.
[Alexander Gerasimov]

*) Read queued datagrams in one batch with recvmmsg() where the platform has
it, and read the socket’s local address once per event-loop pass instead
of once per datagram, halving the syscalls the ngtcp2 engine spends on a
busy socket. The OpenSSL engine already batches inside its own datagram
BIO. Also dropped a per-pass walk of the connection list whose result was
never used.
[Alexander Gerasimov]

*) Added H3SocketBufferSize, which asks for the QUIC socket send and receive buffer size. A receive buffer left at the OS default overflows once a single connection runs at speed, and each dropped datagram costs a retransmit; the OS still caps what it grants, and a capped grant is logged rather than fatal.
[Alexander Gerasimov]

*) Added H3SessionTickets, which controls whether TLS 1.3 session tickets are issued so a returning client can resume instead of running a full handshake. Tickets stay on by default, as before, and each worker process keeps its own ticket keys, so a client resumes only when it returns to the process that issued its ticket.
[Alexander Gerasimov]

*) Added H3EarlyData, off by default, together with an engine capability bit saying whether 0-RTT can be accepted at all. The OpenSSL QUIC stack has no server-side 0-RTT, so turning early data on there now logs a warning that names the engine instead of silently doing nothing.
[Alexander Gerasimov]

*) Published the mod_ssl TLS environment for HTTP/3 requests: SSL_PROTOCOL, SSL_CIPHER, SSL_CIPHER_USEKEYSIZE, SSL_CIPHER_ALGKEYSIZE, SSL_CIPHER_EXPORT and SSL_SESSION_RESUMED, under the names mod_ssl uses. mod_ssl does not manage these connections, so scripts and rewrite conditions that read them saw nothing but HTTPS=on over HTTP/3. The values are read from the QUIC engine through a new conn.tls_info entry and formatted once per connection, not per request.
[Alexander Gerasimov]

Installation

For EL8, EL9 and EL10:

dnf module reset -y httpd
dnf module enable -y httpd:codeit
dnf config-manager --setopt=CodeIT-testing.module_hotfixes=1 --save

dnf --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

For EL7:

yum --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

Verify the installed versions:

rpm -q httpd mod_http3

Expected versions:

httpd-2.4.68-2...
mod_http3-0.0.52-1...

Configuration

Default example configuration file is /etc/httpd/vhosts.d/http3-vhost.conf (installed together with the package):

EnableMMAP Off

# Keep the existing Listen directive.
# Do not duplicate it if another configuration file already contains it:
# Listen 443 https

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    Protocols h3 h2 http/1.1

    H3Port 443
    H3QuicEngine openssl
    H3CertificatePath    /etc/pki/tls/certs/localhost.crt
    H3CertificateKeyPath /etc/pki/tls/private/localhost.key

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Require all granted
    </Directory>
</VirtualHost>

Check the configuration and restart Apache:

httpd -t
httpd -M | grep -E 'http3|http2|ssl'
systemctl restart httpd

Firewall

HTTP/3 uses QUIC over UDP. Both TCP and UDP port 443 must be open:

firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload

Check the listeners:

ss -lntup | grep ':443'

Testing HTTP/3

The CodeIT ngtcp2 package includes the osslclient QUIC test client. To test the local Apache instance while sending example.com as the target hostname, run:

dnf install ngtcp2
osslclient 127.0.0.1 443 https://example.com

This connects directly to UDP port 443 on localhost and performs an HTTP/3 request using example.com for TLS and HTTP hostname handling.

You can also use a curl build that lists HTTP3 in curl -V:

curl --http3-only -vkI https://example.com/

A successful response should contain:

HTTP/3 200

You can also test graceful restart behavior while an HTTP/3 connection is active:

apachectl graceful
journalctl -u httpd -f

The first browser request may use HTTP/2 while the browser discovers HTTP/3 through Alt-Svc. Reload the page and check the Protocol column in browser Developer Tools for h3.

Please report successful installations, crashes, compatibility issues and graceful-restart problems through comments.

mod_http3 0.0.52 for Apache httpd 2.4.68 is available for testing

Experimental mod_http3 0.0.52 packages are now available in the CodeIT testing repository for EL7, EL8, EL9 and EL10.

The module requires our patched httpd 2.4.68-2 package, which includes MPM changes required for externally managed QUIC connections.

HTTP/3 support remains experimental. Use these packages on testing systems before considering production deployment.

Installation

For EL8, EL9 and EL10:

dnf module reset -y httpd
dnf module enable -y httpd:codeit
dnf config-manager --setopt=CodeIT-testing.module_hotfixes=1 --save

dnf --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

For EL7:

yum --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

Verify the installed versions:

rpm -q httpd mod_http3

Expected versions:

httpd-2.4.68-2...
mod_http3-0.0.52-1...

Configuration

Default example configuration file is /etc/httpd/vhosts.d/http3-vhost.conf (installed together with the package):

EnableMMAP Off

# Keep the existing Listen directive.
# Do not duplicate it if another configuration file already contains it:
# Listen 443 https

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    Protocols h3 h2 http/1.1

    H3Port 443
    H3QuicEngine openssl
    H3CertificatePath    /etc/pki/tls/certs/localhost.crt
    H3CertificateKeyPath /etc/pki/tls/private/localhost.key

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Require all granted
    </Directory>
</VirtualHost>

Check the configuration and restart Apache:

httpd -t
httpd -M | grep -E 'http3|http2|ssl'
systemctl restart httpd

Firewall

HTTP/3 uses QUIC over UDP. Both TCP and UDP port 443 must be open:

firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload

Check the listeners:

ss -lntup | grep ':443'

Testing HTTP/3

The CodeIT ngtcp2 package includes the osslclient QUIC test client. To test the local Apache instance while sending example.com as the target hostname, run:

dnf install ngtcp2
osslclient 127.0.0.1 443 https://example.com

This connects directly to UDP port 443 on localhost and performs an HTTP/3 request using example.com for TLS and HTTP hostname handling.

You can also use a curl build that lists HTTP3 in curl -V:

curl --http3-only -vkI https://example.com/

A successful response should contain:

HTTP/3 200

You can also test graceful restart behavior while an HTTP/3 connection is active:

apachectl graceful
journalctl -u httpd -f

The first browser request may use HTTP/2 while the browser discovers HTTP/3 through Alt-Svc. Reload the page and check the Protocol column in browser Developer Tools for h3.

Please report successful installations, crashes, compatibility issues and graceful-restart problems through comments.

ngtcp2 1.25.0 rpms released

ngtcp2 1.25.0 rpms released and added to all supported platforms.

Major changes:

– Fix build error with gcc-16 by @tatsuhiro-t – build(deps): bump actions/cache from 5 to 6 by @dependabotbot – ksl: Align keys in 8 bytes boundary by @tatsuhiro-t – bbr: Update longterm variable computation by @tatsuhiro-t – Remove condition that is always true by @tatsuhiro-t – Verify the end offset of STREAM frame before updating flow control by @tatsuhiro-t – Rework connection flow window accounting after sending STOP_SENDING by @tatsuhiro-t – Stop buffering data after shutting downstream read by @tatsuhiro-t in – Cleanup by @tatsuhiro-t – Update bbr by @tatsuhiro-t – Update doc by @tatsuhiro-t – Add ngtcp2_stream_close2 callback by @tatsuhiro-t – examples: Adopt ngtcp2_stream_close2 callback by @tatsuhiro-t – Tweak stream_close2 callback behavior by @tatsuhiro-t – Expand NGTCP2_MAX_INITIAL_CRYPTO_OFFSET to 64K by @tatsuhiro-t – Partially revert #2242 by @tatsuhiro-t – Make max CRYPTO offsets configurable by @tatsuhiro-t – Minor cleanup by @tatsuhiro-t – Optimize rob by @tatsuhiro-t – build(deps): bump actions/setup-python from 6 to 7 by @dependabotbot – Optimize acktr by @tatsuhiro-t – Remove ngtcp2_acktr_entry and squeeze len into key by @tatsuhiro-t – Minor fixups by @tatsuhiro-t – Amend ba2e5f0142863a0a539671e0194de6019008ad3e (part of #2255) by @tatsuhiro-t – Deal with the case where client migrate back to the original path by @tatsuhiro-t – crypto/quictls: Rework the global initialization by @tatsuhiro-t – ksl: Remove unnecessary NULL initialization by @tatsuhiro-t – Document about C11 compilers by @tatsuhiro-t – Bump boringssl by @tatsuhiro-t – Bump aws-lc to v5.4.0 by @tatsuhiro-t – Bump picotls by @tatsuhiro-t – fuzz: Fuzz more parameters like CID, AEAD tag, and transport parameters by @tatsuhiro-t – Revert “Make max CRYPTO offsets configurable” by @tatsuhiro-t – Require nghttp3 >= 1.18.0 by @tatsuhiro-t

ngtcp2 libraries stack built with OpenSSL 4.0.1. QUIC client name is osslclient.

nghttp3 1.18.0 rpms released

nghttp3 1.18.0 rpms released and added to all supported platforms.

Major changes:

– ksl: Align keys in 8 bytes boundary by @tatsuhiro-t – Update doc by @tatsuhiro-t – Add nghttp3_conn_close_stream2 and nghttp3_stream_close2 callback by @tatsuhiro-t – Validate header length against the estimated uncompressed length by @tatsuhiro-t – ksl: Port ngtcp2 changes by @tatsuhiro-t – Document C compilers by @tatsuhiro-t – Fix build error with gcc-16 by @tatsuhiro-t

NGINX 1.31.3 Mainline with Brotli, TLS 1.3, OpenSSL 4.0.1, HTTP/2 and HTTP/3 for Red Hat Enterprise Linux, CentOS, Rocky, Oracle, Alma Linux EL7/EL8/EL9/EL10

nginx 1.31.3 Mainline with HTTP/3 support added to EL7, EL8, EL9 and EL10 repositories. Brotli compression module from Google, http2, ngx_cache_purge and ngx_http_geoip2 modules are built in. OpenSSL is built dynamically using official OpenSSL 4.0.1 with QUIC support.

Major changes:

*) Security: heap buffer overflow might occur in a worker process when using the map directive with regex matching if the map variable was included in a string expression after a capture affected by this map; a similar issue might happen when using a non-cacheable variable in a string expression (CVE-2026-42533). Thanks to Mufeed VH of Winfunc Research and Maxim Dounin.

*) Security: uninitialized memory access might occur when using unnamed regex captures with the “slice” directive or background cache update, which could result in worker process memory disclosure or worker process termination (CVE-2026-60005).

*) Security: use-after-free might occur when processing a specially crafted proxied backend response with the ngx_http_ssi_filter_module (CVE-2026-56434). Thanks to P4P3R-HAK.

*) Change: the size of headers and trailers in HTTP/2 responses in the ngx_http_proxy_v2_module and ngx_http_grpc_module is now limited with “proxy_buffer_size” and “grpc_buffer_size” directives.

*) Change: loading of external entities is now disabled in the ngx_http_xslt_filter_module. Thanks to Maxim Dounin.

*) Feature: the “xml_external_entities” directive in the ngx_http_xslt_filter_module. Thanks to Maxim Dounin.

*) Feature: the “proxy_socket_sndbuf”, “proxy_socket_rcvbuf”, “fastcgi_socket_sndbuf”, “fastcgi_socket_rcvbuf”, “grpc_socket_sndbuf”, “grpc_socket_rcvbuf”, “scgi_socket_sndbuf”, “scgi_socket_rcvbuf”, “uwsgi_socket_sndbuf”, “uwsgi_socket_rcvbuf”, “tunnel_socket_sndbuf”, and “tunnel_socket_rcvbuf” directives.

*) Feature: cache line size detection for loongarch64. Thanks to Miao Wang.

*) Bugfix: now nginx rejects HTTP/2 requests with out-of-order pseudo-headers.

*) Bugfix: in flow control in the ngx_http_v2_module.

*) Bugfix: “[error] upstream sent frame for unknown stream” and “[crit] cache file … contains invalid header” messages might appear in logs when sending a cached HTTP/2 response in the ngx_http_proxy_v2_module if the “proxy_cache_revalidate” directive was used.

*) Bugfix: nginx might send the “Upgrade” header line in HTTP/2 and HTTP/3 responses.

*) Bugfix: in the ngx_http_perl_module. Thanks to Maxim Dounin.

*) Bugfix: IPv6 fragmentation might not be disabled when using QUIC on some operating systems.

*) Bugfix: in the ngx_http_auth_basic_module on Solaris.

*) Bugfixes and improvements in the ngx_http_tunnel_module.

NGINX 1.30.4 Stable with Brotli, TLS 1.3, OpenSSL 4.0.1, HTTP/2 and HTTP/3 for Red Hat Enterprise Linux, CentOS, Rocky, Oracle, Alma Linux EL7/EL8/EL9/EL10

nginx 1.30.4 Stable with HTTP/3 support added to EL7, EL8, EL9 and EL10 repositories. Brotli compression module from Google, http2, ngx_cache_purge and ngx_http_geoip2 modules are built in. OpenSSL is built dynamically using official OpenSSL 4.0.1 with QUIC support.

Major changes:

    *) Security: heap buffer overflow might occur in a worker process when using the map directive with regex matching if the map variable was included in a string expression after a capture affected by this map; 
       a similar issue might happen when using a non-cacheable variable in a string expression (CVE-2026-42533).
       Thanks to Mufeed VH of Winfunc Research and Maxim Dounin.

    *) Security: uninitialized memory access might occur when using unnamed regex captures with the "slice" directive or background cache update, which could result in worker process memory disclosure or worker process termination (CVE-2026-60005).

    *) Security: use-after-free might occur when processing a specially crafted proxied backend response with the ngx_http_ssi_filter_module (CVE-2026-56434).
       Thanks to P4P3R-HAK.

ngtcp2 1.24.0 rpms released

ngtcp2 1.24.0 rpms released and added to all supported platforms.

Major changes:

– crypto: Add openssl libs to cryptotest by @tatsuhiro-t – Add –disable-crypto configure option by @tatsuhiro-t – crypto: Add ngtcp2_crypto_ossl_free by @tatsuhiro-t – examples: Avoid the deprecated nghttp3 APIs by @tatsuhiro-t – lib: Add recv_stop_sending callback by @pimterry – lib: Add ngtcp2_conn_set_max_stream_data_thresh by @tatsuhiro-t – lib: Tweak ngtcp2_conn_set_max_stream_data_thresh by @tatsuhiro-t – Remove max stream data thresh by @tatsuhiro-t – Rewrite window filter from scratch by @tatsuhiro-t – lib: Tweak app-limited detection by @tatsuhiro-t – build(deps): bump actions/checkout from 6 to 7 by @dependabotbot – lib: Simplify app-limited conditions by @tatsuhiro-t – Bump openssl to v4.0.1 by @tatsuhiro-t – Bump boringssl by @tatsuhiro-t – Bump aws-lc to v5.1.0 by @tatsuhiro-t – Bump picotls by @tatsuhiro-t – Bump wolfssl to v5.9.2-stable by @tatsuhiro-t

ngtcp2 libraries stack built with OpenSSL 4.0.1. QUIC client name is osslclient.

nghttp3 1.17.0 rpms released

nghttp3 1.17.0 rpms released and added to all supported platforms.

Major changes:

– lib: Add nghttp3_downcase_byte by @tatsuhiro-t – lib: Fix header name validation by @tatsuhiro-t – lib: Reformat downcase table by @tatsuhiro-t – Add nghttp3_conn_stream_flushed by @tatsuhiro-t – lib: Take into account non-DATA frame in nghttp3_conn_is_stream_flushed by @tatsuhiro-t – Update scripts by @tatsuhiro-t – Reformat huffman data tables by @tatsuhiro-t – Update doc by @tatsuhiro-t – lib: Treat non-existent stream flushed by @tatsuhiro-t – Bump sfparse by @tatsuhiro-t – lib: Add the public API to encode and decode variable-length integer by @tatsuhiro-t – build(deps): bump actions/checkout from 6 to 7 by @dependabotbot – Add missing version-added by @tatsuhiro-t

NGINX 1.30.3 Stable with Brotli, TLS 1.3, OpenSSL 4.0.1, HTTP/2 and HTTP/3 for Red Hat Enterprise Linux, CentOS, Rocky, Oracle, Alma Linux EL7/EL8/EL9/EL10

nginx 1.30.3 Stable with fixes for buffer overflow vulnerability in the ngx_http_proxy_v2_module and ngx_http_grpc_module (CVE-2026-42055), and buffer overread vulnerability in the ngx_http_charset_module (CVE-2026-48142)  added to EL7, EL8, EL9 and EL10 repositories. Brotli compression module from Google, http2, ngx_cache_purge and ngx_http_geoip2 modules are built in. OpenSSL is built dynamically using official OpenSSL 4.0.1 with QUIC support.

Major changes:

  • Security: a heap memory buffer overflow might occur in a worker
  • Security: a heap memory buffer overread might occur in a worker

NGINX 1.31.2 Mainline with Brotli, TLS 1.3, OpenSSL 4.0.1, HTTP/2 and HTTP/3 for Red Hat Enterprise Linux, CentOS, Rocky, Oracle, Alma Linux EL7/EL8/EL9/EL10

nginx 1.31.2 Mainline with fixes for buffer overflow vulnerability in the ngx_http_proxy_v2_module and ngx_http_grpc_module (CVE-2026-42055), and buffer overread vulnerability in the ngx_http_charset_module (CVE-2026-48142) added to EL7, EL8, EL9 and EL10 repositories. Brotli compression module from Google, http2, ngx_cache_purge and ngx_http_geoip2 modules are built in. OpenSSL is built dynamically using official OpenSSL 4.0.1 with QUIC support.

Major changes:

  • Security: use-after-free might occur when using HTTP/3 and processing
  • Security: a heap memory buffer overflow might occur in a worker
  • Security: a heap memory buffer overread might occur in a worker
  • Change: now the $request_id variable uses SipHash-2-4.
  • Feature: the $ssl_sigalgs variable.
  • Bugfix: a variable defined by the “split_clients” directive might be constant time “secure_link” hash comparison.