Ktor Client における SSL
コード例: client-ssl-config
Ktor クライアントで SSL を構成するには、クライアントが使用するエンジンの構成をカスタマイズする必要があります。 このトピックでは、JVM および Android をターゲットとするエンジンに対して SSL 証明書を追加する方法を紹介します。
Ktor API を使用して自己署名証明書を生成する方法については、自己署名証明書の生成を参照してください。
SSL 設定の読み込み
このトピックでは、Ktor クライアントは、サーバー用に生成された既存の KeyStore ファイル(keystore.jks)から読み込まれた証明書を使用します。 異なるエンジンが SSL を構成するために異なる JSSE API を使用する(例えば、Apache では SSLContext、Jetty では TrustManager)ことを考慮し、対応する SSL 構成を取得できるようにしておく必要があります。以下のコードスニペットは、既存の KeyStore ファイル(keystore.jks)から証明書を読み込み、SSL 構成を読み込むための関数を提供する SslSettings オブジェクトを作成します。
object SslSettings {
fun getKeyStore(): KeyStore {
val keyStoreFile = FileInputStream("keystore.jks")
val keyStorePassword = "foobar".toCharArray()
val keyStore: KeyStore = KeyStore.getInstance(KeyStore.getDefaultType())
keyStore.load(keyStoreFile, keyStorePassword)
return keyStore
}
fun getTrustManagerFactory(): TrustManagerFactory? {
val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustManagerFactory.init(getKeyStore())
return trustManagerFactory
}
fun getSslContext(): SSLContext? {
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, getTrustManagerFactory()?.trustManagers, null)
return sslContext
}
fun getTrustManager(): X509TrustManager {
return getTrustManagerFactory()?.trustManagers?.first { it is X509TrustManager } as X509TrustManager
}
}Ktor での SSL 構成
このセクションでは、さまざまなエンジンに対して SSL を構成する方法を見ていきます。 完全な例はこちらで見ることができます: client-ssl-config
JVM
Apache
Apache で SSL を有効にするには、SSLContext を渡す必要があります。
val apacheClient = HttpClient(Apache5) {
engine {
sslContext = SslSettings.getSslContext()
}
}Java
Java クライアントの場合は、config ブロック内の sslContext 関数に SSLContext を渡します。
val javaClient = HttpClient(Java) {
engine {
config {
sslContext(SslSettings.getSslContext())
}
}
}Jetty
Jetty の場合は、SslContextFactory のインスタンスを作成し、SSLContext を渡す必要があります。
val jettyClient = HttpClient(Jetty) {
engine {
sslContextFactory = SslContextFactory.Client().apply {
sslContext = SslSettings.getSslContext()
}
}
}JVM および Android
Android をターゲットとするすべてのエンジンは、ネットワークセキュリティ構成を使用します。
CIO
CIO エンジンでは、https ブロック内で HTTPS 設定を構成できます。 このブロック内では、TLSConfigBuilder によって提供される TLS パラメータにアクセスできます。 この例では、TrustManager インスタンスを使用して証明書を構成しています。
val cioClient = HttpClient(CIO) {
engine {
https {
trustManager = SslSettings.getTrustManager()
}
}
}sockets-client-tls の例では、すべての証明書を信頼する方法を示しています。 このアプローチは開発目的のみに使用してください。
Android
Android エンジンは、SSL 設定を構成するために sslManager プロパティを使用します。 このプロパティは、SSLSocketFactory を渡すことができる HttpsURLConnection をパラメータとして受け取ります。
val androidClient = HttpClient(Android) {
engine {
sslManager = { httpsURLConnection ->
httpsURLConnection.sslSocketFactory = SslSettings.getSslContext()?.socketFactory
}
}
}OkHttp
OkHttp で SSL を使用するように構成するには、sslSocketFactory 関数に SSLSocketFactory と X509TrustManager を渡す必要があります。
val okHttpClient = HttpClient(OkHttp) {
engine {
config {
sslSocketFactory(SslSettings.getSslContext()!!.socketFactory, SslSettings.getTrustManager())
}
}
}Darwin
Darwin エンジンで信頼済み証明書を構成するには、CertificatePinner を使用します。
