如何禁用 Ktor 客户端 SSL 验证?

How can I disable Ktor client SSL verification?

我正在尝试连接到具有来自内部测试环境的自签名证书的服务,该环境仅在原型制作期间存在。 Ktor 客户端失败

javax.net.ssl.SSLHandshakeException: PKIX path building failed:
 sun.security.provider.certpath.SunCertPathBuilderException:
 unable to find valid certification path to requested target

在这种情况下如何禁用证书验证?

警告!不要在任何生产环境中使用它。我已经在没有任何敏感内容的隔离测试环境中完成了此操作

按照 Java: Overriding function to disable SSL certificate check (specifically: )

上第一个答案的说明进行操作

我发现我可以添加自己的 TrustAll 管理器实现:

import java.security.cert.X509Certificate
import javax.net.ssl.X509TrustManager

class TrustAllX509TrustManager : X509TrustManager {
    override fun getAcceptedIssuers(): Array<X509Certificate?> = arrayOfNulls(0)

    override fun checkClientTrusted(certs: Array<X509Certificate?>?, authType: String?) {}

    override fun checkServerTrusted(certs: Array<X509Certificate?>?, authType: String?) {}
}

要将其添加到 Ktor 客户端,我们需要配置引擎。我目前正在使用 Apache 引擎,因此您可能需要更改 setter 以适合您选择的引擎。

import io.ktor.client.*
import io.ktor.client.engine.apache.*
import java.security.SecureRandom
import javax.net.ssl.SSLContext

val client = HttpClient(Apache) {
    engine {
        sslContext = SSLContext.getInstance("TLS")
            .apply {
                init(null, arrayOf(TrustAllX509TrustManager()), SecureRandom())
            }
    }
    // install other features ....
}

我鼓励任何发现如何为其他引擎执行此操作的人添加他们自己的答案,或者,如果您将其添加为评论,我会尽量更新此答案

这是我对 CIO 引擎的解决方案。

val client = HttpClient(CIO) {
    engine {
        https {
            trustManager = object: X509TrustManager {
                override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) { }

                override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) { }

                override fun getAcceptedIssuers(): Array<X509Certificate>? = null
            }
        }
    }
}