Skip to content
Client Plugin

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オブジェクトを作成します。

kotlin
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を渡す必要があります。

kotlin
val apacheClient = HttpClient(Apache5) {
    engine {
        sslContext = SslSettings.getSslContext()
    }
}

Java

Javaクライアントの場合、configブロック内のsslContext関数にSSLContextを渡します。

kotlin
val javaClient = HttpClient(Java) {
    engine {
        config {
            sslContext(SslSettings.getSslContext())
        }
    }
}

Jetty

Jettyの場合、SslContextFactoryのインスタンスを作成し、SSLContextを渡す必要があります。

kotlin
val jettyClient = HttpClient(Jetty) {
    engine {
        sslContextFactory = SslContextFactory.Client().apply {
            sslContext = SslSettings.getSslContext()
        }
    }
}

JVMおよびAndroid

Androidをターゲットとするすべてのエンジンは、ネットワークセキュリティ構成を使用します。

CIO

CIOエンジンでは、httpsブロック内でHTTPS設定を構成できます。 このブロック内では、TLSConfigBuilderが提供するTLSパラメータにアクセスできます。 この例では、TrustManagerインスタンスが証明書を構成するために使用されます。

kotlin
val cioClient = HttpClient(CIO) {
    engine {
        https {
            trustManager = SslSettings.getTrustManager()
        }
    }
}

sockets-client-tlsの例は、すべての証明書を信頼する方法を示しています。 このアプローチは開発目的でのみ使用してください。

Android

Androidエンジンは、SSL設定を構成するためにsslManagerプロパティを使用します。 このプロパティは、パラメータとしてHttpsURLConnectionを受け入れ、SSLSocketFactoryを渡すことができます。

kotlin
val androidClient = HttpClient(Android) {
    engine {
        sslManager = { httpsURLConnection ->
            httpsURLConnection.sslSocketFactory = SslSettings.getSslContext()?.socketFactory
        }
    }
}

OkHttp

OkHttpでSSLを使用するように構成するには、SSLSocketFactoryX509TrustManagersslSocketFactory関数に渡す必要があります。

kotlin
val okHttpClient = HttpClient(OkHttp) {
    engine {
        config {
            sslSocketFactory(SslSettings.getSslContext()!!.socketFactory, SslSettings.getTrustManager())
        }
    }
}

Darwin

Darwinエンジンで信頼された証明書を構成するには、CertificatePinnerを使用します。