使用 Jetty 11 的 HTTP/3 服务器没有响应

lep*_*epe 4 java https jetty http3 jetty-11

我正在尝试使用 Jetty 11 和 Java 11 来实现 HTTP/3 测试服务器(作为实验)。我正在遵循文档中的代码:

public class HTTP3Server {
    public static void main(String[] args) {
        Server server = new Server();

        // The SSL Context
        SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
        sslContextFactory.setKeyStorePath("/etc/java/keystore.jks");
        sslContextFactory.setKeyStorePassword("password");

        // The HTTP configuration object
        HttpConfiguration httpConfig = new HttpConfiguration();
        SecureRequestCustomizer src = new SecureRequestCustomizer();
        src.setSniHostCheck(false);
        httpConfig.addCustomizer(src);

        // Create and configure the HTTP/3 connector.
        HTTP3ServerConnectionFactory h3Factory = new HTTP3ServerConnectionFactory(httpConfig);
        HTTP3ServerConnector connector = new HTTP3ServerConnector(server, sslContextFactory, h3Factory);
        connector.setPort(3443);
        server.addConnector(connector);

        // Create and configure a ResourceHandler.
        ResourceHandler handler = new ResourceHandler();

        // Configure the directory where static resources are located.
        handler.setBaseResource(Resource.newResource("/var/www/"));

        // Configure directory listing.
        handler.setDirectoriesListed(false);

        // Configure welcome files.
        handler.setWelcomeFiles(new String[]{"index.html"});

        // Configure whether to accept range requests.
        handler.setAcceptRanges(true);
        server.setHandler(handler);

        // Start server
        server.start();
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 密钥库在 HTTP/1.1 或 HTTP/2 中使用时工作正常(我需要在这里为 HTTP/3 做任何不同的事情吗?)。
  • /var/www/index.html存在。
  • 服务器启动时没有警告或错误:
2023-05-25 10:31:06.305:INFO :oejs.Server:main: jetty-11.0.15; built: 2023-04-11T18:37:53.775Z; git: 5bc5e562c8d05c5862505aebe5cf83a61bdbcb96; jvm 11.0.19+7-post-Ubuntu-0ubuntu122.04.1
2023-05-25 10:31:06.338:INFO :oejhs.HTTP3ServerConnector:main: HTTP/3+QUIC support is experimental and not suited for production use.
2023-05-25 10:31:06.623:INFO :oejus.SslContextFactory:main: x509=X509@4af0df05(localhost,h=[icl test],a=[],w=[]) for Server@674bd420[provider=null,keyStore=file:///etc/java/keystore.jks,trustStore=null]
2023-05-25 10:31:06.661:INFO :oejs.AbstractConnector:main: Started HTTP3ServerConnector@4bd31064{h3, (h3)}{0.0.0.0:3443}
2023-05-25 10:31:06.733:INFO :oejs.Server:main: Started Server@30c93896{STARTING}[11.0.15,sto=0] @1189ms
Run Code Online (Sandbox Code Playgroud)
  • UDP 端口 3443 似乎是开放的(而 TCP 端口 3443 是关闭的):
PORT     STATE         SERVICE
3443/udp open|filtered ov-nnm-websrv
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是预期的。

  • 最后,在 Chrome 中打开 https://localhost:3443/ 失败,就好像它不存在一样(服务器日志中没有注册任何活动)。

我需要做什么才能让它发挥作用?

sbo*_*det 5

不幸的是,恐怕事情比这复杂得多。

JettyHTTP3Client可以与 Google 等 HTTP/3 服务器进行通信。同样,JettyHTTP3Client可以与 Jetty 的 HTTP/3 服务器进行通信。由于 Jetty 的 HTTP/3 实现在客户端和服务器之间共享,因此人们会认为让浏览器与 Jetty HTTP/3 服务器对话是一件轻而易举的事。

然而,每个浏览器都有一个秘密酱汁(据我所知)需要进行逆向工程,并且每种酱汁都是不同的。

例如,浏览器拒绝自签名证书是很常见的,因此您的服务器必须具有合法域的 CA 签名证书才能与浏览器配合使用。

此外,浏览器不允许除端口 443 之外的 HTTP/3 通信也很常见,因此您必须以管理员/root 权限启动服务器。我们还相信,协商的密码强度也发挥了作用。

还有更多:浏览器不会通过 QUIC 建立第一次直接通信。他们首先尝试 HTTP/2,如果服务器宣布支持 HTTP/3,那么浏览器可能会切换到使用 HTTP/3。然而,目前尚不清楚到底要切换的策略是什么,例如HTTP/2 ALTSVC帧是否是必要的,或者Alt-Svc标头是否足够,或者两者是否都需要。

最重要的是,这将是一项艰巨的任务,即使秘密针对一种浏览器被揭开,它也可能不适用于其他浏览器。

Jetty 团队致力于发现并记录至少一种秘密武器,但到目前为止我们还没有成功。

如果有人知道浏览器的秘密武器来分享它,我会非常高兴,但那里的信息似乎很少而且经常过时。我们会坚持并最终找到它。