【问题标题】:How to accept incoming self-signed SSL certificate in OkHttp?如何在 OkHttp 中接受传入的自签名 SSL 证书?
【发布时间】:2019-11-04 18:49:24
【问题描述】:
我有这个要求,应用程序是分布式的,所以端点是每个公司的,没有集中的。问题是应用需要允许自签名证书。
显然,我不能只在应用程序中硬编码证书并使用数百万可用的 sn-ps 来执行此操作。
那么,有没有办法处理这种证书不受信任的 SSL 异常,然后向用户显示“此证书不受信任 bla bla。接受?”。
TLDR; 如何在 OkHttp 中获取违规的证书内容,然后将其保存在 sslSocketFactory 子类中?
【问题讨论】:
标签:
okhttp
okhttp3
self-signed-certificate
【解决方案1】:
您可以修改类似于以下示例代码的内容
private fun createInsecureTrustManager(): X509TrustManager = object : X509TrustManager {
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
val s = "Do you want to accept {${chain.first().subjectX500Principal.name}}?"
val response = JOptionPane.showConfirmDialog(null, s, "Confirm",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)
if (response == JOptionPane.NO_OPTION) {
throw CertificateException("Not accepting ${chain.first().subjectX500Principal.name}}")
}
}
override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
}
将它添加到密钥库不应该是目标,您应该能够在运行密钥库验证之前接受它。注意此示例可能应该回退到默认逻辑,但它应该可以帮助您入门。