HTTP/2
コード例: http2-netty, http2-jetty
HTTP/2は、HTTP/1.xの後継として設計された、最新のバイナリ二重多重化プロトコルです。
JettyおよびNettyエンジンは、Ktorが利用できるHTTP/2実装を提供します。ただし、これらには大きな違いがあり、各エンジンには追加の設定が必要です。ホストがKtor用に適切に設定されると、HTTP/2のサポートが自動的に有効になります。
主な要件:
- SSL証明書(自己署名でも可)。
- 特定のエンジンに適したALPN実装(NettyとJettyの対応するセクションを参照)。
SSL証明書
仕様によると、HTTP/2は暗号化を必須としませんが、すべてのブラウザはHTTP/2で使用するために暗号化された接続を要求します。そのため、動作するTLS環境がHTTP/2を有効にするための前提条件となります。したがって、暗号化を有効にするには証明書が必要です。テスト目的の場合、JDKのkeytool
を使用して生成できます...
keytool -keystore test.jks -genkeypair -alias testkey -keyalg RSA -keysize 4096 -validity 5000 -dname 'CN=localhost, OU=ktor, O=ktor, L=Unspecified, ST=Unspecified, C=US'
...またはbuildKeyStore関数を使用します。
次のステップは、Ktorがキーストアを使用するように設定することです。例のapplication.conf
/ application.yaml
設定ファイルを参照してください。
ktor {
deployment {
port = 8080
sslPort = 8443
}
application {
modules = [ com.example.ApplicationKt.main ]
}
security {
ssl {
keyStore = test.jks
keyAlias = testkey
keyStorePassword = foobar
privateKeyPassword = foobar
}
}
}
ktor:
deployment:
port: 8080
sslPort: 8443
application:
modules:
- com.example.ApplicationKt.main
security:
ssl:
keyStore: test.jks
keyAlias: testkey
keyStorePassword: foobar
privateKeyPassword: foobar
ALPN実装
HTTP/2を有効にするには、ALPN (Application-Layer Protocol Negotiation) が有効になっている必要があります。最初のオプションは、ブートクラスパスに追加する必要がある外部のALPN実装を使用することです。もう1つのオプションは、OpenSSLネイティブバインディングとプリコンパイルされたネイティブバイナリを使用することです。また、特定のエンジンはこれらの方法のいずれか1つしかサポートしない場合があります。
Jetty
Java 8以降でALPN APIがサポートされているため、JettyエンジンはHTTP/2を使用するための特定の設定を必要としません。したがって、次のことを行うだけです。
http2-jetty実行可能な例は、JettyのHTTP/2サポートを示しています。
Netty
NettyでHTTP/2を有効にするには、OpenSSLバインディング (tcnative netty port) を使用します。以下の例は、ネイティブ実装(OpenSSLのフォークである静的リンクされたBoringSSLライブラリ)をbuild.gradle.kts
ファイルに追加する方法を示しています。
val osName = System.getProperty("os.name").lowercase()
val tcnative_classifier = when {
osName.contains("win") -> "windows-x86_64"
osName.contains("linux") -> "linux-x86_64"
osName.contains("mac") -> "osx-x86_64"
else -> null
}
dependencies {
if (tcnative_classifier != null) {
implementation("io.netty:netty-tcnative-boringssl-static:$tcnative_version:$tcnative_classifier")
} else {
implementation("io.netty:netty-tcnative-boringssl-static:$tcnative_version")
}
}
tc.native.classifier
は、linux-x86_64
、osx-x86_64
、またはwindows-x86_64
のいずれかである必要があります。http2-netty実行可能な例は、NettyのHTTP/2サポートを有効にする方法を示しています。