0

Jetty 9.2 HTTP/1.1 + SSL のみのサーバー (組み込み) を Jetty 9.3.0 (v20150612) HTTP/HTTPS 2.0 (SLL(TLS)-ALPN-HTTP/2) にアップグレードしました。JRE 8 (Oracle 1.8.0 Build 45 - b15) と Eclipse を使用しています。

* JOAKIM の回答によって解決された問題: 解決策については投稿の最後を参照してください *

アップグレード前は、HTTP と HTTPS は正常に機能していましたが、Jetty 9.3 Jar ファイルで再構築するだけで正常に機能していました。次に、SSL(TLS)-ALPN-HTTP/2-HTTP/1.1 を組み込むようにコードをアップグレードしました (見つけた例から学びました)。私が使用した主な例は 、コード付きのこのリンクにあります

Google Chrome (バージョン 43.0.2357.130 m) ブラウザは、http:// 10.32.1.110:8080/ などの http 要求で正常に動作し、Web ページが表示されます。しかし、2 番目のタブを開いて https:// 10.32.1.110:8443/ を試すと、エラー ERR_EMPTY_RESPONSE が表示されます。しかし、webtide.com に接続して https セッションを取得することはできます。私のシステムのファイアウォールの干渉は排除されました。10.32.??? 接続は、失敗した HTTPS の場合と同様に、動作中の HTTP についてもそれを渡しません。

このエラーは Jetty サーバーをブロックしません (サーバーはエラーをスローしたり、ログに記録したりしません)。最初のブラウザー タブに戻って Web ページのリクエストを続行すると、更新されていることがわかります (タイムスタンプがあり、その中のカウンター)毎回。

HTTPS の場合、私の handle() メソッドは Jetty によって呼び出されず (それを監視するためのログ行があります)、HTTP リクエストのみが handle() メソッドに入っていることがわかります。私の handle() に到着する http リクエストは、Jetty リクエスト オブジェクトによると、タイプ HTTP/1.1 です。私の調査によると、Google Chrome は SSL/ALPN なしでは HTTP/2 を実行しないため、これは正常です。

HTTPS リクエストが ERR_EMPTY_RESPONSE になる理由として、SSL と ALPN の問題の方向で考えてきました。alpn-api-1.1.2.v20150522.jar が「-Xbootclasspath/p:D:\Users\TWO\DATA\Eclipse\alpn-api-1.1.2」として Eclipse VM 引数 (JVM ブート クラスパスに相当) に追加されます。 .v20150522\alpn-api-1.1.2.v20150522.jar" それ以来、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 のキーストアへのパスのみを変更しました。私はいつも同じキーストア ファイルを使用しています。なぜなら、それで問題ないことがわかっているからです (投稿の冒頭を参照してください - 私の古い HTTP/1.1+SLL は機能し、同じキーストアを使用していました。

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

http でのアクセスは機能しますが、https では機能せず、ブラウザーは ERR_EMPTY_RESPONSE を再度表示します。

IExplorer 11 を使用してみました。同じ結果です。404 (このページが見つかりません) と混同しないように、https (msg = このページは表示できません) ではなく http で機能します。IE とは対照的に、Chrome では greg のコードが http で使用されたときに「Cookie」警告が表示されましたが、https では表示されませんでした。

上記の問題を解決する方法を知っている人はいますか。ティア

* 解決 *

Joakim の提案に従って、alpn-api-1.1.2.v20150522.jar の代わりに alpn-boot-8.1.3.v20150130.jar をブート クラスパスに追加しました。テストの結果、次の組み合わせが完全に機能しました。

  • HTTP/1.1 (HTTP) - Google Chrome で実行
  • HTTP/1.1 (HTTP) - IE での 2 回目の試行

  • HTTP/2.0 + SSL (HTTPS) - Google Chrome で実行

  • HTTP/1_1 + SLL (HTTPS) - IE で実行

  • HTTP/2_0 (HTTP) - 迅速なユーザー エージェントがないため、テストしませんでした。

これらは私が興味を持っている唯一の将来の組み合わせですが、SSL を使用した HTTP/2_0 も機能すると確信しています。

このJetty ドキュメント リンクは、別の JRE で同じ問題が発生した場合に使用する JRE バージョンと ALPN JAR ファイル バージョン間の表を示しています。

これを解決するために努力してくれたすべての人に感謝します。

4

1 に答える 1