Привет! Подключаем в свое приложение крипто про TLS, используем okhttp и retrofit.
вот так выглядит инициализация okhttp:
if (!TLSUtils.initCSPProviders(context)) {
Log.i(Constants.APP_LOGGER_TAG, "Couldn't initialize CSP.")
}
TLSUtils.initJavaProviders()
val trustManagers = arrayOfNulls<TrustManager>(1)
val sslContext = TLSUtils.initTLSExample(context, trustManagers)
val sslSocketFactory = sslContext.socketFactory
val trustManager = trustManagers[0] as X509TrustManager
OkHttpClient.Builder().apply {
sslSocketFactory(sslSocketFactory, trustManager)
}.build()
метод initTlsExample выглядит следующим образом:
fun initTLSExample(
context: Context,
trustManagers: Array<TrustManager?> = arrayOf()
): SSLContext {
val dataDir = context.applicationInfo.dataDir
val sslContext: SSLContext
try {
sslContext = createSSLContext(dataDir, trustManagers = trustManagers)
} catch (e: Exception) {
throw RuntimeException(e)
}
return sslContext
}
метод createSSLContext:
fun createSSLContext(
dataDir: String,
useClientAuth: Boolean = true,
trustManagers: Array<TrustManager?>
): SSLContext {
val sslCtx: SSLContext
// Используется общее для всех хранилище корневых
// сертификатов cacerts.
val trustStorePath = (dataDir +
File.separator + BKSTrustStore.STORAGE_DIRECTORY + File.separator +
BKSTrustStore.STORAGE_FILE_TRUST)
if (useClientAuth) {
sslCtx = TLSContext.initAuthClientSSL(
Provider.PROVIDER_NAME, // провайдер, по умолчанию - JTLS
"TLSv1.2", // протокол, по умолчанию - GostTLS
JCSP.PROVIDER_NAME,
Constants.keyStoreType,
Constants.CLIENT_CONTAINER_2012_256_NAME, // точный алиас ключа
BouncyCastleProvider.PROVIDER_NAME,
BKSTrustStore.STORAGE_TYPE,
FileInputStream(trustStorePath), String(BKSTrustStore.STORAGE_PASSWORD),
trustManagers
)
} else {
sslCtx = TLSContext.initClientSSL(
Provider.PROVIDER_NAME, // провайдер, по умолчанию - JTLS
"TLSv1.2", // протокол, по умолчанию - GostTLS
BouncyCastleProvider.PROVIDER_NAME,
BKSTrustStore.STORAGE_TYPE,
FileInputStream(trustStorePath), String(BKSTrustStore.STORAGE_PASSWORD),
trustManagers
)
}
return sslCtx
}
У меня возникло 2 вопроса:
1. Мы получаем ошибку в логах
ru.CryptoPro.JCSP.MSCAPI.cl_5.finalize :: Key ERROR: 0x57
java.lang.IllegalArgumentException: Key ERROR: 0x57
at ru.CryptoPro.JCSP.MSCAPI.cl_5.c(Unknown Source:169)
at ru.CryptoPro.JCSP.MSCAPI.cl_5.finalize(Unknown Source:2)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:291)
at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:278)
at java.lang.Daemons$Daemon.run(Daemons.java:139)
at java.lang.Thread.run(Thread.java:923)
Что это за ошибка и как ее исправить?
2. У меня нет понимания, как подключить TLS сертификат к запросам, в примере у вас на сайте видел, что сертификаты лежат в папочке root_certs, однако даже если удалить эти сертификаты, то запросы успешно отрабатывали. Буду благодарен если объясните, как это работает, или дадите ссылку на подробную документацию, где рассказано все