han*_*001 5 ssl kotlin ktor ktor-client
我正在尝试连接到一个具有来自内部测试环境的自签名证书的服务,该证书仅在原型设计期间存在。Ktor 客户端失败并显示
javax.net.ssl.SSLHandshakeException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何禁用证书验证?
这是我的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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
警告!不要在任何生产环境中使用它。我是在一个孤立的测试环境中完成此操作的,其中没有任何内容是敏感的
按照 Java 上第一个答案的说明进行操作:重写功能以禁用 SSL 证书检查(具体来说: https: //stackoverflow.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?) {}
}
Run Code Online (Sandbox Code Playgroud)
要将其添加到 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 ....
}
Run Code Online (Sandbox Code Playgroud)
我鼓励任何发现如何为其他引擎执行此操作的人添加自己的答案,或者,如果您将其添加为评论,我将尽力更新此答案
| 归档时间: |
|
| 查看次数: |
5683 次 |
| 最近记录: |