您的位置:

okhttp出现ProtocolException("constructed octet strings not supported for DER")的解决方案

  发布时间:2023-01-21 18:30:02
如何解决解决这个问题的方法有以下几种:检查证书是否是正确格式的,确保证书是正确的DER编码。如果证书是自签名的,则可以尝试在Okhttp中跳过证书验证。这可以通过在构建Okhttp客户端时使用一个信任所有证书的证书库来实现。建议确保证书是正确的DER编码,并且代码正确的加载和使用证书。使用例子是的,这是一个在Kotlin中使用Okhttp忽略证书验证的示例代码这段代码会忽略所有的证书验证, 但是这样会带来安全风险。

报错的原因

这个错误通常是由于在使用okhttp发送请求时,请求中使用了错误格式的证书导致的。DER是一种用于编码证书信息的二进制编码格式,如果证书的格式不正确,则会导致该错误。建议检查证书是否是正确格式的,或者检查代码是否正确的加载和使用证书。

如何解决

解决这个问题的方法有以下几种:

1. 检查证书是否是正确格式的,确保证书是正确的DER编码。

2. 检查代码是否正确的加载和使用证书。确保证书正确的载入和使用。

3. 如果证书是自签名的,则可以尝试在Okhttp中跳过证书验证。这可以通过在构建Okhttp客户端时使用一个信任所有证书的证书库来实现。

建议确保证书是正确的DER编码,并且代码正确的加载和使用证书。

使用例子

是的,这是一个在Kotlin中使用Okhttp忽略证书验证的示例代码:


val trustAllCerts = arrayOf(object : X509TrustManager {
    override fun checkClientTrusted(chain: Array?, authType: String?) {
    }

    override fun checkServerTrusted(chain: Array?, authType: String?) {
    }

    override fun getAcceptedIssuers(): Array {
        return arrayOf()
    }
})

val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
val sslSocketFactory = sslContext.socketFactory

val client = OkHttpClient.Builder()
        .sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
        .hostnameVerifier { _, _ -> true }
        .build()

这段代码会忽略所有的证书验证, 但是这样会带来安全风险。

需要注意的是,这样做会忽略所有的证书验证, 如果请求是在一个不安全的网络中进行,会有可能会受到中间人攻击。