Skip to content
Client Plugin

Ktor Client 中的 SSL

代码示例: client-ssl-config

要在 Ktor 客户端中配置 SSL,您需要自定义客户端使用的引擎配置。 在本主题中,我们将向您展示如何为面向 JVMAndroid 的引擎添加 SSL 证书。

要了解如何使用 Ktor API 生成自签名证书,请参见生成自签名证书

加载 SSL 设置

在本主题中,Ktor 客户端将使用从为服务器生成的现有 KeyStore 文件 (keystore.jks) 中加载的证书。 鉴于不同的引擎使用不同的 JSSE API 来配置 SSL(例如,Apache 使用 SSLContext,Jetty 使用 TrustManager),我们需要有能力获取相应的 SSL 配置。下面的代码片段创建了 SslSettings 对象,该对象从现有 KeyStore 文件 (keystore.jks) 中加载证书,并提供用于加载 SSL 配置的函数:

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 客户端,请将 SSLContext 传递给 config 代码块内的 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 引擎使用 sslManager 属性来配置 SSL 设置。 此属性接受 HttpsURLConnection 作为形参,允许您传递 SSLSocketFactory

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

OkHttp

要配置 OkHttp 以使用 SSL,您需要将 SSLSocketFactoryX509TrustManager 传递给 sslSocketFactory 函数:

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

### Darwin {id="darwin"}

要为 Darwin 引擎配置受信任证书,请使用 [CertificatePinner](https://api.ktor.io/ktor-client/ktor-client-darwin/io.ktor.client.engine.darwin.certificates/-certificate-pinner/index.html)。