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プロパティを使用します。 このプロパティは、パラメータとしてHttpsURLConnectionを受け入れ、SSLSocketFactoryを渡すことができます。
val androidClient = HttpClient(Android) {
engine {
sslManager = { httpsURLConnection ->
httpsURLConnection.sslSocketFactory = SslSettings.getSslContext()?.socketFactory
}
}
}OkHttp
OkHttpでSSLを使用するように構成するには、SSLSocketFactoryとX509TrustManagerをsslSocketFactory関数に渡す必要があります。
val okHttpClient = HttpClient(OkHttp) {
engine {
config {
sslSocketFactory(SslSettings.getSslContext()!!.socketFactory, SslSettings.getTrustManager())
}
}
}Darwin
Darwinエンジンで信頼された証明書を構成するには、CertificatePinnerを使用します。
