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を使用します。