Android Okhttp CertificatePinner Якорь доверия для пути сертификации не найден + ошибка закрепления сертификата

Я использую Okhttp для закрепления сертификата. Если я использую построитель сертификатов следующим образом

val certificatePinner = CertificatePinner.Builder()
                .add("2.54.3.88", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
                .build()
        builder.addInterceptor(interceptor)
                .certificatePinner(certificatePinner)

Я получаю исключение Якорь доверия для пути сертификации не найден

Но перед закреплением сертификата, если я поставлю следующий код

val trustAllCerts:  Array<TrustManager> = arrayOf(object : X509TrustManager {
                override fun checkClientTrusted(chain: Array<out java.security.cert.X509Certificate>?, authType: String?) {

                }

                override fun checkServerTrusted(chain: Array<out java.security.cert.X509Certificate>?, authType: String?) {

                }

                override fun getAcceptedIssuers(): Array<out java.security.cert.X509Certificate>? = arrayOf()
            })

            // Install the all-trusting trust manager
            val  sslContext = SSLContext.getInstance("SSL")
            sslContext.init(null, trustAllCerts, SecureRandom())

            // Create an ssl socket factory with our all-trusting manager
            val sslSocketFactory = sslContext.socketFactory
            if (trustAllCerts.isNotEmpty() &&  trustAllCerts.first() is X509TrustManager) {
                builder.sslSocketFactory(sslSocketFactory, trustAllCerts.first() as X509TrustManager)
                builder.hostnameVerifier { hostname, session -> true }
            }
        } catch (e: Exception) {
        }

val certificatePinner = CertificatePinner.Builder()
                .add("2.54.3.88", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
                .build()
        builder.addInterceptor(interceptor)
                .certificatePinner(certificatePinner)

Я получаю исключение ошибки закрепления сертификата следующим образом

Response Failure: Certificate pinning failure!
Peer certificate chain:
Pinned certificates for 2.54.3.88:sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=

Согласно этому блогу в случае Исключение ошибки закрепления сертификата, Okhttp должен предоставить вам хэши открытого ключа сертификата сервера. Но я получаю пустой ответ в цепочке сертификатов Peer:

P.S: Приведенное выше имя хоста и открытый ключ SSL ненастоящие, но все же, даже если я использую настоящие, я получаю те же результаты.


person Nouman Bhatti    schedule 28.07.2021    source источник
comment
Обратите внимание, что приложения, которые использовали ваш доверенный менеджер доверия, были заблокированы в Play Store. Возможно, вы захотите проверить политики нужного вам канала распространения приложений или найти способы не делать то, что вы пытаетесь сделать.   -  person CommonsWare    schedule 28.07.2021
comment
OkHttp вернет доверенные сертификаты в цепочке одноранговых сертификатов и проверит закрепление сертификата на этом. Поэтому, если вы отключите безопасность, вы не сможете использовать закрепление сертификата.   -  person Yuri Schimke    schedule 28.07.2021
comment
@YuriSchimke Okhttp не возвращает доверенные сертификаты в цепочке одноранговых сертификатов, я становлюсь пустым. Что вы имеете в виду под Итак, если вы отключите безопасность, вы не сможете использовать закрепление сертификата?   -  person Nouman Bhatti    schedule 29.07.2021
comment
Ваш X509TrustManager и HostnameVerifier небезопасны, вся безопасность соединения отключена, и поэтому закрепление сертификата не включено.   -  person Yuri Schimke    schedule 29.07.2021
comment
@YuriSchimke Но даже если я удалю весь код для отключения безопасности и добавлю только код для CertificatePinner, я все равно получу якорь доверия для пути сертификации, который не найден. Не могли бы вы предложить, что с этим не так, или предложить какой-либо код   -  person Nouman Bhatti    schedule 02.08.2021
comment
Он не доверяет сертификату вашего сервера. Если вы хотите, чтобы это было безопасно, вы должны зарегистрировать сертификат в своем коде или по телефону. Если вам нужен небезопасный сервер разработки, вы можете внести его в белый список. stackoverflow.com/questions/53304082/   -  person Yuri Schimke    schedule 02.08.2021