如何禁用 Ktor 客户端 SSL 验证?
Posted
技术标签:
【中文标题】如何禁用 Ktor 客户端 SSL 验证?【英文标题】:How can I disable Ktor client SSL verification? 【发布时间】:2021-06-04 00:55:41 【问题描述】:我正在尝试从仅在原型设计期间存在的内部测试环境连接到具有自签名证书的服务。 Ktor 客户端失败
javax.net.ssl.SSLHandshakeException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
在这种情况下如何禁用证书验证?
【问题讨论】:
【参考方案1】:这是我的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
【讨论】:
【参考方案2】:警告!不要在任何生产环境中使用它。我已经为一个隔离的测试环境做了这个,没有什么是敏感的
按照Java: Overriding function to disable SSL certificate check(具体为:https://***.com/a/19723687/2733184)上第一个答案中的说明进行操作
我发现我可以添加自己的 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 引擎,因此您可能需要更改设置器以适合您选择的引擎。
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 ....
我鼓励任何发现如何为其他引擎执行此操作的人添加他们自己的答案,或者,如果您将其添加为评论,我会尽量保持更新此答案
【讨论】:
以上是关于如何禁用 Ktor 客户端 SSL 验证?的主要内容,如果未能解决你的问题,请参考以下文章