我为使用Comodo / Sectigo SSL证书的公司工作。但是突然之间,我们的应用在使用ok 4客户端的android 4和5版本中将POST发送到服务器时开始引发此错误。
HTTP FAILED: javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate expired at Sat May 30 05:48:38 CDT 2020 (compared to Mon Jun 08 23:13:02 CDT 2020)
我尝试了许多StackOverflow解决方案,但均未成功。然后我在Comodo博客上发现了此交叉签名证书warning
Sectigo目前提供了与证书交叉签名的功能 AddTrust旧版根目录可增加对非常旧系统的支持 和设备。此根将于2020年5月结束。 依赖此交叉签名的根的应用程序或安装 必须在2020年5月之前更新,否则可能会出现断电或显示故障的风险 错误消息。
我尝试了一些其他操作,以使okhttp客户端信任证书(在Socket上启用了TLS,在okhttp构建器中的连接规范中添加了现代TLS,TLS版本和密码套件,将证书添加到了原始资源中,一个自定义的SslSocketFactory客户端),但是这些都不起作用,总是向我抛出一个与证书有效性或握手异常有关的错误。
唯一对我有用的方法是创建一个不安全的okhttp,但显然不建议在生产环境中使用它。
[该应用程序在android> 5中运行良好,但由于此问题,我们仍然在android 5甚至4上仍有一些用户无法使用该应用程序。还有什么方法可以实现android <= 5信任这个过期的根吗?
感谢您的帮助
如果证书在其他方面有效,则有望解决此问题。
在您的构建文件中
implementation 'org.conscrypt:conscrypt-android:2.4.0'
并在您请求之前激活Conscrypt
import org.conscrypt.Conscrypt
Security.insertProviderAt(Conscrypt.newProvider(), 1)
val client = OkHttpClient.Builder().build()
val request = Request.Builder().url("https://status.datadoghq.com/").build()
client.newCall(request).execute().use { response ->
println(response.code())
}
如果在此之后仍然失败,那么您可能还需要注册一个自定义证书,但请首先进行测试,然后再进行此操作。