Я пытаюсь внедрить аутентификацию 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
и избежать этого предупреждения?