gpt4 book ai didi

java - 嵌入式 Jetty HTTP/2 不适用于 Firefox/Chrome,但似乎可以用于 Safari

转载 作者:搜寻专家 更新时间:2023-10-31 19:54:10 25 4
gpt4 key购买 nike

我正在嵌入式 Jetty (9.3.0.v20150612) 中实现一个 servlet,我想使用 HTTP/2。

我正在为协议(protocol)协商启用 ALPN 以选择 HTTP1.1 或 HTTP2。当我从 Safari 8(仅支持 HTTP1.1)或 Safari 9(同时支持 HTTP1.1 和 HTTP2)向我的 servlet 发送 HTTPs 请求时,我从我的 servlet 得到了答复。当我从 Firefox 39 执行相同的请求时,它不起作用,我只收到 NS_ERROR_ABORT。我在使用 Chrome 时遇到了同样的问题。

我有两个问题:

  1. 为什么我没有从 Chrome 和 Firefox 得到答案
  2. 我如何知道 Safari 9 是否使用了 HTTP/2 而不是 HTTP1.1? (我的 IOS9 应用程序也可以正常连接)

下面是执行Jetty初始化的代码

    private void startHTTP2Server() {
WebServerProperties webProperties = WebServerProperties.getInstance();

HttpConfiguration config = getHttpConfiguration();

HttpConnectionFactory http1 = new HttpConnectionFactory(config);
HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(config);

NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol(http1.getProtocol()); // sets default protocol to HTTP 1.1

// SSL Connection Factory
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(webProperties.getKeystore());
sslContextFactory.setKeyStorePassword(webProperties.getKeystorePassword());
//sslContextFactory.setKeyManagerPassword(KEYSTORE_PW);
//sslContextFactory.addExcludeCipherSuites(".*RC4.*");
//sslContextFactory.addExcludeCipherSuites("TLS_DHE_RSA.*");
sslContextFactory.setProtocol(webProperties.getTLSVersion()); // SEB
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol());

Server server = new Server();
//ServerConnector connector = new ServerConnector(server, ssl, alpn, http2, http1);
ServerConnector connector = new ServerConnector(server, ssl, alpn, http2, http1);
connector.setPort(webProperties.getPort());
server.addConnector(connector);

// --- SEB
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(webProperties.getServletContext());
context.setResourceBase(System.getProperty(webProperties.getServletTmpDir()));
server.setHandler(context);

// Add dump servlet
context.addServlet(IMonServer.class, webProperties.getServletPath());

try {
server.start();
server.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private static HttpConfiguration getHttpConfiguration() {
WebServerProperties webProperties = WebServerProperties.getInstance();
HttpConfiguration config = new HttpConfiguration();
config.setSecureScheme("https");
config.setSecurePort(webProperties.getPort());
config.setSendXPoweredBy(true);
config.setSendServerVersion(true);
config.addCustomizer(new SecureRequestCustomizer());
return config;
}

当我启动服务器时,我还提供了 Java 选项 -Xbootclasspath/p:$installDirectory/lib/alpn-boot-8.1.3.v20150130.jar

有什么不对或遗漏的吗?感谢您的帮助,

问候,

最佳答案

您的代码是正确的,只是缺少两行对于让 HTTP/2 正常工作很重要。

当您配置 SslContextFactory 时,添加以下行:

    sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
sslContextFactory.setUseCipherSuitesOrder(true);

这两行的作用是对 TLS 密码进行排序,使 HTTP/2 密码优先于其他密码,并要求遵守该顺序。

如果没有排序,服务器将回退到不强制密码强度的旧版 HTTP/2 (h2-14),但不幸的是,这被 Chrome 和 Firefox 拒绝了。

我不确切地知道它为什么与 Safari 一起工作:要么是 Safari 错误,要么是对 HTTP/2 规范相对于其他浏览器的密码强度的更宽松的解释。

关于java - 嵌入式 Jetty HTTP/2 不适用于 Firefox/Chrome,但似乎可以用于 Safari,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com