Как реализовать аутентификацию клиента TLS? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь внедрить аутентификацию TLS, аутентифицированную клиентом, в Android.

Мой веб-сайт тестирования:

https://client.badssl.com/

Я скачал сертификат клиента и выполнилследующая логика для приложения Android:

class Retrofit {

    companion object {

        fun getSSLContext(): SSLContext? {
            MainActivity.appContext?.let {
                val badssl = it.resources!!.openRawResource(R.raw.badssl)
                val baddsslPassword = "badssl.com".toCharArray()

                val keyStore = KeyStore.getInstance("PKCS12")
                keyStore.load(badssl, baddsslPassword)

                val keyManagerFactory = KeyManagerFactory.getInstance("X509")
                keyManagerFactory.init(keyStore, baddsslPassword)

                val keyManagers = keyManagerFactory.keyManagers

                val sslContext = SSLContext.getInstance("TLS")
                sslContext.init(keyManagers, null, null)

                return sslContext
            }

            return null
        }

        fun get(): Api {
            val httpLoggingInterceptor = HttpLoggingInterceptor()
            httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY

            val okHttpClientBuilder = OkHttpClient.Builder()
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(1, TimeUnit.MINUTES)
                .writeTimeout(1, TimeUnit.MINUTES)
                .addInterceptor(httpLoggingInterceptor)

            getSSLContext()?.let {
                okHttpClientBuilder.sslSocketFactory(it.socketFactory)
            }

            val okHttpClient = okHttpClientBuilder.build()

            val retrofit = Retrofit.Builder()
                .baseUrl("https://client.badssl.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build()

            return retrofit.create(Api::class.java)
        }
    }
}

interface Api {

    @GET("/")
    fun get(): Single<ResponseBody>
}

Без логики SSLContext Я получаю следующий ответ:

400 Плохой запрос

Смоя SSLContext логика Я получаю следующий ответ:

200 OK

Этот сайт требует аутентификации клиента TLS handshake

Как правильно реализоватьclient-authenticated TLS handshake и избежать этого предупреждения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...