Полное руководство по устранению неполадок HTTP/3 в Jetty 12.1
Узнайте, как диагностировать и исправлять проблемы HTTP/3 в Jetty 12.1: от серверных проверок до инструментов проверки в браузере и решений ошибок конфигурации.
Как можно диагностировать, почему HTTP/3 не работает на моём демо‑сервере Jetty 12.1, несмотря на правильную конфигурацию?
Я настроил демо‑сервер Jetty 12.1.4 с включённым HTTP/3 согласно официальной документации. В консоли выводится, что HTTP/3 запущен:
oejs.AbstractConnector:main: Started oejs.ServerConnector@18b30951{SSL, (ssl, alpn, h2, http/1.1)}{0.0.0.0:8443}
oejs.AbstractConnector:main: Started oejs.ServerConnector@22ee7fdc{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
oeqqs.AbstractQuicheServerConnectionFactory:main: HTTP/3+QUIC support is experimental and not suited for production use.
netstat подтверждает, что Jetty слушает правильные порты:
tcp6 0 0 :::8443 :::* LISTEN 38203/java
udp6 0 0 :::8444 :::* 38203/java
Однако браузеры (Firefox 145.0 и Chrome 142.0.7444.162) используют только HTTP/2, несмотря на получение заголовка alt‑svc:
alt-svc: h3=":8443"
Я пробовал:
- Использовать доверенный сертификат вместо тестового
- Изменить порты HTTP/3 и HTTP/2 на 443
- Проверить, что заголовок
alt‑svcуказывает на правильный UDP‑порт
Окружение
- ОС: Fedora release 43 (Forty Three)
- Java: OpenJDK 25.0.1
- Браузеры: Firefox 145.0 и Chrome 142.0.7444.162
Какие шаги я могу предпринять, чтобы выяснить, почему HTTP/3 не используется? Существуют ли инструменты и техники как на стороне сервера, так и на стороне браузера, которые помогут отладить эту проблему с реализацией HTTP/3?
HTTP/3 отладка на Jetty 12.1.4 требует системного подхода с использованием как серверных диагностических инструментов, так и проверок со стороны клиента. В вашем случае сервер запускается корректно, но браузеры используют только HTTP/2 – проблема, скорее всего, связана с совместимостью сертификата, ограничениями браузеров или несоответствием конфигурации.
Содержание
- Инструменты и методы проверки
- Диагностика со стороны браузера
- Диагностика со стороны сервера
- Проверка конфигурации
- Распространённые проблемы и решения
Инструменты и методы проверки
Использование cURL с поддержкой HTTP/3
Самый надёжный способ проверить работу HTTP/3 – использовать cURL с ключом --http3. Согласно документации curl по HTTP/3, можно напрямую протестировать ваш сервер:
curl -v --http3 -k https://localhost:8443
Если HTTP/3 работает корректно, вы увидите вывод, похожий на:
* HTTP/3 stream 0 opened
> GET / HTTP/3
> Host: localhost:8443
> User-Agent: curl/8.6.0
> Accept: */*
< HTTP/3 200
< server: Jetty(12.1.4)
< alt-svc: h3=":8443"
Онлайн‑инструменты тестирования HTTP/3
Ниже перечислены онлайн‑инструменты, которые помогут диагностировать поддержку HTTP/3:
- HTTP/3 Test by Domsignal – использует cURL для проверки поддержки HTTP/3
- HTTP3 Test Checker – делает запросы cURL для проверки поддержки HTTP/3
- HTTP/3 Check – тестирует сервис QUIC и протокол HTTP/3
Эти инструменты быстро дают подтверждение, но могут не работать в средах разработки на localhost.
Диагностика со стороны браузера
Инспекция протокола в вкладке Network
Как указано в документации ServerPilot, в инструментах разработчика браузера можно проверить протокол:
- Откройте Developer Tools (Ctrl+Shift+I или Command+Option+I)
- Перейдите во вкладку Network
- Перезагрузите страницу
- Посмотрите колонку «Protocol» для ваших запросов
Согласно блогу Cloudflare, протокол должен показывать «h3» для соединений HTTP/3.
Специфические особенности браузеров
В вашей среде задействованы Firefox 145.0 и Chrome 142.0.7444.162. По данным обсуждений на GitHub Chrome и Safari не работают с самоподписанными сертификатами при HTTP/3:
Chrome и Safari не работают, так как не поддерживают использование самоподписанного SSL‑сертификата с HTTP/3. Требуется реальный TLS 1.3 сертификат от публичного CA.
Это объясняет, почему попытка использовать доверенный сертификат могла не сработать – нужен сертификат, подтверждённый публичным центром сертификации.
Тестирование в Firefox Nightly
Для более детальной диагностики HTTP/3 рассмотрите использование Firefox Nightly, который имеет расширенные возможности отладки QUIC.
Диагностика со стороны сервера
Dump компонентов Jetty
Jetty предоставляет функцию dump компонентов, показывающую детали конфигурации сервера. Согласно документации Jetty по отладке, её можно включить, добавив:
-Djetty.server.dumpAfterStart=true
Это покажет подробную информацию о ваших коннекторах и их настройках, помогая убедиться, что HTTP/3 настроен правильно.
Анализ логов сервера
Проверьте логи Jetty на наличие ошибок или предупреждений, связанных с HTTP/3. Предупреждение о экспериментальной поддержке, которое вы видели, нормальное:
oeqqs.AbstractQuicheServerConnectionFactory:main: HTTP/3+QUIC support is experimental and not suited for production use.
Но ищите дополнительные ошибки, указывающие на проблемы с сертификатом, портом или конфигурацией.
Проверка портов и процессов
Ваш вывод netstat показывает правильные порты прослушивания:
tcp6 0 0 :::8443 :::* LISTEN 38203/java
udp6 0 0 :::8444 :::* 38203/java
Убедитесь, что никакие другие процессы не используют эти порты и что файрволл разрешает UDP‑трафик на порт 8444.
Проверка конфигурации
Зависимости модулей
Убедитесь, что включены все необходимые модули. Согласно операционному руководству Jetty, вам нужны:
--add-modules=ssl,http2,https,test-keystore
Модуль test-keystore предоставляет самоподписанный сертификат, но помните, что он не подходит для продакшена с современными браузерами.
Конфигурационные файлы HTTP/3
Проверьте, что ваш jetty-http3.xml содержит правильные настройки:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.ServerConnector">
<Arg name="server"><Ref id="Server"/></Arg>
<Arg name="factories">
<Array type="org.eclipse.jetty.server.ConnectionFactory">
<Item>
<New class="org.eclipse.jetty.http3.server.QuicServerConnectionFactory"/>
</Item>
</Array>
</Arg>
</New>
</Arg>
</Call>
</Configure>
Сертификат и настройка TLS
HTTP/3 требует поддержки TLS 1.3. Проверьте, что ваша версия Java поддерживает TLS 1.3 – OpenJDK 25.0.1 должна, но убедитесь, что наборы шифров совместимы.
Согласно документации Jetty по HTTP/3, существует 1:1 соотношение между сессией QUIC и сессией HTTP/3, что требует правильной настройки TLS.
Распространённые проблемы и решения
Ограничения самоподписанных сертификатов
Как упоминалось в нескольких источниках, современные браузеры, такие как Chrome и Safari, ограничивают использование самоподписанных сертификатов при HTTP/3. Нужно получить сертификат от доверенного центра сертификации.
Проблемы с настройкой портов
Вы упоминали попытку использовать порт 443 для HTTP/3 и HTTP/2 одновременно. Однако HTTP/3 использует UDP, а HTTP/2 – TCP, поэтому они требуют отдельных портов. Стандартная конфигурация:
- HTTP/2: TCP 8443
- HTTP/3: UDP 8444
Совместимость версий браузеров
Убедитесь, что браузеры полностью обновлены. Некоторые старые версии могут иметь ограниченную поддержку HTTP/3, даже если заявляют о ней.
Сетевые и файрволл‑соображения
UDP‑трафик (используемый HTTP/3) может блокироваться файрволлами или провайдерами. При возможности протестируйте на разных сетях или временно отключите правила файрволла для тестов.
Совместимость версии Java
Хотя OpenJDK 25.0.1 должен работать, проверьте, что ваша дистрибуция Jetty совместима. Некоторые функции HTTP/3 могут требовать конкретных версий Java.
Источники
- HTTP/3 Test by Domsignal
- ServerPilot - Verify HTTP/3 is working for a domain
- Putzi San - Validating HTTP/3 Protocol Support on a Local Site
- Geekflare - How to Test if a Website Supports HTTP/3?
- HTTP3-test by Daniel Stenberg
- Plesk - How to check if http3 is working on the website?
- cURL - HTTP/3 with curl
- HTTP/3 Check
- Cloudflare - How to test HTTP/3 and QUIC with Firefox Nightly
- GitHub - murphye/spring-boot-http-3-jetty
- Jetty - Programming Guide - Troubleshooting Component Dump
- Jetty - Programming Guide - HTTP/3 Server Library
- Jetty - Operations Guide - Protocols
Вывод
Для отладки реализации HTTP/3 на Jetty 12.1.4 сосредоточьтесь на следующих ключевых моментах:
- Используйте cURL с ключом
--http3для надёжной проверки на стороне сервера. - Проверьте вкладку Network в браузере на наличие протокола «h3».
- Получите доверенный сертификат вместо самоподписанного для Chrome/Safari.
- Проверьте зависимости модулей и конфигурационные файлы.
- Тестируйте в Firefox Nightly для расширенной отладки QUIC.
- Проверьте настройки файрволла для доступа к UDP‑порту 8444.
- Анализируйте логи сервера на наличие ошибок конфигурации.
Наиболее вероятная причина в вашей среде – ограничения браузеров на самоподписанные сертификаты для HTTP/3. Начните с тестирования доверённого сертификата и проверки через cURL, затем переходите к диагностике в браузере.