您的位置:

ProtocolException("constructed bit strings not supported for DER")的处理方案

  发布时间:2023-01-21 16:30:02
报错的原因在Kotlin中使用OkHttp时出现错误的原因是,OkHttp在处理DER格式的证书时出现了问题是一种用于证书和公钥的编码规则。如何解决解决这种错误的一种方法是更新到最新版本的OkHttp,因为最新版本可能已经修复了这个问题。另外一种解决方法是,如果您确定证书是有效的,并且确信您需要使用它,那么您可以禁用OkHttp的证书验证。

报错的原因

在Kotlin中使用OkHttp时出现ProtocolException("constructed bit strings not supported for DER")错误的原因是,OkHttp在处理DER格式的证书时出现了问题。DER(Distinguished Encoding Rules)是一种用于证书和公钥的编码规则。这种错误通常是由于证书格式不正确或不支持导致的。

如何解决

解决这种错误的一种方法是更新到最新版本的OkHttp,因为最新版本可能已经修复了这个问题。

另外一种解决方法是,如果您确定证书是有效的,并且确信您需要使用它,那么您可以禁用OkHttp的证书验证。您可以在创建OkHttpClient时使用newBuilder()方法来设置它。


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

这将允许您在不进行证书验证的情况下使用该证书。

还可以尝试更换证书或联系证书管理机构进行更换。

请注意,禁用证书验证可能会带来安全风险,因此在生产环境中只应在绝对必要时使用。

使用例子

是的,以下是一个使用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, SecureRandom())

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

val request = Request.Builder()
        .url("https://example.com")
        .build()

val response = client.newCall(request).execute()

上面这段代码中使用了X509TrustManager来禁用证书验证,并在创建OkHttpClient时设置了sslSocketFactory和hostnameVerifier来实现禁用证书验证。

请注意,在生产环境中,禁用证书验证可能会带来安全风险,因此只应在绝对必要时使用。