当前位置: 首页 > 知识库问答 >
问题:

Jetty 9.3 SSL-ALPN-HTTP2错误ERR_EMPTY_RESPONSE仅使用HTTPS

霍永年
2023-03-14

我已经将Jetty 9.2HTTP/1.1+SSL服务器(嵌入式)升级到Jetty 9.3.0(v20150612)HTTP/HTTPS 2.0(SLL(TLS)-alpn-HTTP/2)。我使用JRE8(Oracle1.8.0Build45-B15)和Eclipse。

*通过JOAKIM的回答解决问题:解决方案见帖子末尾*

在升级之前,HTTP和HTTPS工作得很好,只要用Jetty9.3 Jar文件重新构建就可以了。然后,我升级了代码(从我设法找到的示例中学习),以合并SSL(TLS)-alpn-http/2-http/1.1。我使用的主要示例是在这个带有代码的链接中

Google Chrome(版本43.0.2357.130m)浏览器可以很好地处理http请求,如http://10.32.1.110:8080/并显示网页。但是,如果打开第二个选项卡并尝试https://10.32.1.110:8443/,则会收到一个错误err_empty_response。不过,我可以连接到WebTide.com并获得https会话。防火墙对我的系统的干扰已经排除。10.32.???连接对工作的HTTP和对失败的HTTPS都没有传递它。

这个错误不会阻塞Jetty服务器(服务器不会抛出或记录错误),我可以返回到第一个浏览器选项卡并继续请求web页面,每次都会看到它更新(我在其中有一个时间戳和计数器)。

在HTTPS的情况下,Jetty没有调用我的handle()方法(我有一个日志行来监视它),我只看到handle()方法中的HTTP请求。根据Jetty request对象,到达我的句柄()中的http请求属于http/1.1类型。根据我的研究,这是正常的,因为谷歌Chrome将不会做HTTP/2没有SSL/ALPN。

我一直在思考SSL和ALPN问题是HTTPS请求导致err_empty_response的原因。alpn-api-1.1.2.v20150522.jar作为“-xbootclasspath/p:d:\users\two\data\Eclipse\alpn-api-1.1.2.v20150522\alpn-api-1.1.2.v20150522.jar”添加到我的Eclipse VM参数(相当于JVM引导类路径)中,此后Jetty不再抱怨ALPN不在JVM引导类路径上(像以前那样抛出错误)。从Jetty日志下面,SLL和HTTP/2也正确启动。

Jetty服务器使用以下日志正常启动:

2015-06-24 15:53:29.292:INFO:oejs.Server:main: jetty-9.3.0.v20150612
2015-06-24 15:53:29.323:INFO:oejs.ServerConnector:main: Started ServerConnector@123772c4{HTTP/1.1,[http/1.1, h2c, h2c-17, h2c-16, h2c-15, h2c-14]}{0.0.0.0:8080}
2015-06-24 15:53:29.338:INFO:oejus.SslContextFactory:main: x509={jetty.eclipse.org=jetty} wild={} alias=null for SslContextFactory@6f75e721(file:///D:/Users/[removed]/keystores/keystore,file:///D:/Users/[removed]/keystores/keystore)
2015-06-24 15:53:29.495:INFO:oejs.ServerConnector:main: Started ServerConnector@13deb50e{SSL,[ssl, alpn, h2, h2-17, h2-16, h2-15, h2-14, http/1.1]}{0.0.0.0:8443}
2015-06-24 15:53:29.495:INFO:oejs.Server:main: Started @321ms

以下是相关的Java服务器代码:

... standard Jetty imports plus
import org.eclipse.jetty.alpn.ALPN;
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.http2.HTTP2Cipher;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;


QueuedThreadPool oTP = new QueuedThreadPool(20);
this.oServer = new Server(oTP);
this.oServer.setHandler((Handler) this);

HttpConfiguration httpcfg = new HttpConfiguration();
httpcfg.setSecureScheme("https");
httpcfg.setSecurePort(8443);

HttpConnectionFactory httpF=new HttpConnectionFactory(httpcfg);
HTTP2CServerConnectionFactory http2F=new HTTP2CServerConnectionFactory(httpcfg);

ServerConnector http=new ServerConnector(this.oServer,httpF,http2F);
http.setPort(8080);
this.oServer.addConnector(http);

SslContextFactory sslCF=new SslContextFactory();
sslCF.setKeyStorePath(MetaWebServerConfig.getWebServerKeystore()+"keystore"); 
sslCF.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslCF.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslCF.setTrustStorePath(MetaWebServerConfig.getWebServerKeystore()+"keystore"); 
sslCF.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");

sslCF.setExcludeCipherSuites(
              "SSL_RSA_WITH_DES_CBC_SHA",
              "SSL_DHE_RSA_WITH_DES_CBC_SHA",
              "SSL_DHE_DSS_WITH_DES_CBC_SHA",
              "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
              "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
              "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
              "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");

sslCF.setCipherComparator(new HTTP2Cipher.CipherComparator());

HttpConfiguration httpscfg = new HttpConfiguration(httpcfg);
httpscfg.addCustomizer(new SecureRequestCustomizer());

HTTP2ServerConnectionFactory h2F=new HTTP2ServerConnectionFactory(httpscfg);

NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
ALPNServerConnectionFactory alpnF=new ALPNServerConnectionFactory();
alpnF.setDefaultProtocol(http.getDefaultProtocol());

SslConnectionFactory sslF=new SslConnectionFactory(sslCF,alpnF.getProtocol());
HttpConnectionFactory https2F=new HttpConnectionFactory(httpscfg);

ServerConnector http2=new ServerConnector(this.oServer,sslF,alpnF,h2F,https2F);
http2.setPort(8443);
this.oServer.addConnector(http2);

ALPN.debug=false;
this.oServer.start();

根据gregw的请求,我尝试了顶部链接中的示例代码。我只修改了SSLContextFactory的KeyStoree的路径。我总是使用相同的keystore文件,因为我知道它是可以的(请参见文章开头--我以前的HTTP/1.1+SLL工作并使用相同的keystore。

2015-06-25 14:07:14.972:INFO:oejs.Server:main: jetty-9.3.0.v20150612
2015-06-25 14:07:15.019:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@6f75e721{/,file:///D:/Users/[path]/docroot,AVAILABLE}
2015-06-25 14:07:15.082:INFO:oejs.ServerConnector:main: Started ServerConnector@1888ff2c{HTTP/1.1,[http/1.1, h2c, h2c-17, h2c-16, h2c-15, h2c-14]}{0.0.0.0:8080}
2015-06-25 14:07:15.097:INFO:oejus.SslContextFactory:main: x509={jetty.eclipse.org=jetty} wild={} alias=null for SslContextFactory@4b952a2d(file:///D:/Users/[path]/keystores/keystore,null)
2015-06-25 14:07:15.269:INFO:oejs.ServerConnector:main: Started ServerConnector@5594a1b5{SSL,[ssl, alpn, h2, h2-17, h2-16, h2-15, h2-14, http/1.1]}{0.0.0.0:8443}
2015-06-25 14:07:15.269:INFO:oejs.Server:main: Started @587ms

按照Joakim的建议,我在引导类路径中添加了alpn-boot-8.1.3.v20150130.jar来代替alpn-api-1.1.2.v20150522.jar。在以下组合中恢复的测试工作完美:

>

  • HTTP/1.1(HTTP)-用Google Chrome完成
  • HTTP/1.1(HTTP)-使用IE完成第二次尝试

    HTTP/2.0+SSL(HTTPS)-用Google Chrome完成

    这个Jetty文档链接显示了JRE版本和ALPN JAR文件版本之间的表,以便在使用另一个JRE时使用该表。

    非常感谢所有试图帮助解决这个问题的人。

  • 共有1个答案

    太叔烨霖
    2023-03-14

    对于Oracle/OpenJDK Java JRE/JDK,您使用alpn-boot.jar,而不是alpn-api.jar...

    • 对于Java 1.8.0_25,可以使用alpn-boot-8.1.2.v20141202.jar
    • 对于Java 1.8.0_45,可以使用alpn-boot-8.1.3.v20150130.jar

    有关Java到ALPN的启动版本表,请参见ALPN/Versions文档。

    这一点非常重要,因为它修改了Java本身的SSL/TLS层,以添加对ALPN协议的支持,这是HTTP/2运行所必需的。

    这个-xbootclasspath要求是强制性的,直到将来Java附带内置的ALPN(这是为Java9所安排的)

     类似资料:
    • 问题内容: 我一直在搜索如何使用 conscrypt-openjdk-uber-1.4.1.jar* for jdk8 来实现 Conscrypt SSL提供程序,以支持 ALPN 与服务器建立 http2(使用apache httpclient 5) 连接,因为 jdk8默认不支持ALPN 或另一种解决方案是迁移到jdk9(或更高版本),目前尚不可行,因为我们的产品 严重依赖于jdk8 * 我一

    • 我正在用Java8打这篇文章中提到的相同错误,JMeter 5.1.1版本:Java12 JMeter 5 HTTP/2请求java.lang.NoClassDefFoundError:org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory 我从这里下载了jetty-alpn-java-client并安装在lib目录中并重新启动jmete

    • 问题内容: 码: 前端 后端: 情况: 我添加了删除按钮,以便用户可以删除他的帖子。 当用户单击按钮时,将向我的Node.js服务器发出AJAX请求。 但我收到以下错误: 错误: 题: 这是什么错误,我该如何解决? 问题答案: 您得到的答复实际上是 正确的 。根据文档,Firebase返回200状态代码和 空响应 。就是这样 您应该做的就是检查响应中的状态码和状态码;如果为true,则可以放心地假

    • 我回到了JDK8和Jetty和SPDY,我看到现在Jetty 9.2支持ALPN协议而不是NPN协议(参见我的问题,如何在JDK8上运行Jetty和SPDY?)。所以我设置了: 但现在我有个例外: 我使用和jetty 9.2.2.v20140723。

    • 问题内容: 当尝试运行我的Android应用程序时出现此错误,而我根本不使用Kotlin,该应用程序是用Java编写的… 问题答案: 我这样解决了: 删除所有.gradle文件夹 无效的缓存/重启一切对我来说都可以。

    • 问题内容: 给定具有实验HTTP2支持的最新版本的Node.js: HTTP2服务器: 并对此提出了要求: 它只是挂起并最终说: 如果设置,则错误: 不知道出了什么问题以及为什么到了日志记录的地步。 如果我进入浏览器并访问https:// localhost:8443 ,然后单击警告消息,则它实际上会记录并成功发出请求。但是尚未能够使节点发出请求。 我想将其视为HTTP1服务器,因此不想使用HTT