Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 07.10.2019
Сообщений: 80

Kotlin Retrofit как отправить запрос к серверу с небезопасным сертификатом?

31.05.2025, 11:33. Показов 1162. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Отправляю через Retrofit запросы, но у сервера проблемы с сертификатом. И возникает ошибка javax.net.ssl.sslhandshakeexception. Как мне её обойти и отправить запрос.


Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#Retrofit
object RetrofitInstance {
 
val okHttpClient: OkHttpClient = OkHttpClient.Builder()
        .readTimeout(5, TimeUnit.MINUTES)
    .connectTimeout(5, TimeUnit.MINUTES)
    .build()
 
    val api: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}
 
#API Service
interface ApiService {
    @GET("authorization")
    suspend fun login(@Header("Authorization") authHeader: String): LoginResponse
}
 
#Viewmodel
 private fun login() {
        _loading.value = true
        viewModelScope.launch {
            try {
                val base = email.value+":"+password.value
                val authHeader = "Basic "+Base64.encodeToString(base.toByteArray(),Base64.NO_WRAP)
                println(authHeader)
                val loginResponse = RetrofitInstance.api.login()
                if(loginResponse.user_id!=null && loginResponse.user_id!="") {//
                    //val context = getApplication<Application>().applicationContext
                    //println("HTTP Response:"+loginResponse.refreshToken+loginResponse.id+" "+loginResponse.username+" "+loginResponse.lastName)
                    storeUser(1, loginResponse.user_id, loginResponse.user_name, loginResponse.division_id, loginResponse.division_name, "", "")
                    //storeUser(1, loginResponse.user, loginResponse.user, loginResponse.user, loginResponse.user, "", "")
 
                    TokenManager.saveRefreshToken(applicationContext, authHeader)
 
                    _step.value = AuthSteps.FINAL
                    println("Success Signin")
                } else {
                    _refreshToken.value = authHeader
                    _step.value = AuthSteps.LOGIN//
                    println("Error Signin")
 
                }
            } catch (e: HttpException) {
                ApiUtils.handleHttpException(e) { error ->
                    setToastServerMessage(error)
                }
            }
            //catch (e: Exception) {
           //     setToastMessage(R.string.network_error)
            //}
            finally {
                _loading.value = false
            }
        }
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2025, 11:33
Ответы с готовыми решениями:

Retrofit 2 post запрос
Делал реализацию клиент-сервер, в андроид при помощи retrofit. и встретился с проблемой как...

RX и Retrofit запрос, который ничего не возвращает
Делаю запросы так: subscription = getApi().getData(token) ...

Retrofit 2, POST запрос, авторизация
Добрый день! На собеседовании (Junior Android Dev) мне дали задание написать приложение с...

2
425 / 147 / 27
Регистрация: 12.12.2020
Сообщений: 1,192
01.06.2025, 21:19
Адрес используй http а не https
0
95 / 66 / 30
Регистрация: 22.11.2019
Сообщений: 234
03.06.2025, 13:53
Лучший ответ Сообщение было отмечено Ramunis как решение

Решение

для того, чтобы обойти ошибку по сертификату, можно использоавть небезопасный OkHttp
(!) настоятельно нерекомендую такое выкатывать в прод! данный подход позволяет перехватывать трафик различными сниферам.

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package an.imation.singlee
 
import okhttp3.OkHttpClient
import java.security.KeyStore
import java.security.SecureRandom
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import java.util.concurrent.TimeUnit
import javax.net.ssl.*
 
object UnSafeOkHttp {
 
    fun OkHttpClient.Builder.setUnsafe(): OkHttpClient.Builder {
        return try {
            // Create a trust manager that does not validate certificate chains
            val trustAllCerts = arrayOf<TrustManager>(
                object : X509TrustManager {
                    @Throws(CertificateException::class)
                    override fun checkClientTrusted(
                        chain: Array<X509Certificate?>?,
                        authType: String?
                    ) {
                    }
 
                    @Throws(CertificateException::class)
                    override fun checkServerTrusted(
                        chain: Array<X509Certificate?>?,
                        authType: String?
                    ) {
                    }
 
                    override fun getAcceptedIssuers(): Array<X509Certificate?>? {
                        return 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
            val trustManagerFactory: TrustManagerFactory =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
            trustManagerFactory.init(null as KeyStore?)
            val trustManagers: Array<TrustManager> =
                trustManagerFactory.trustManagers
            check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) {
                "Unexpected default trust managers:" + trustManagers.contentToString()
            }
 
            val trustManager =
                trustManagers[0] as X509TrustManager
 
 
            val builder = this
                .sslSocketFactory(sslSocketFactory, trustManager)
                .hostnameVerifier(HostnameVerifier { _, _ -> true })
            builder
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
 
    val exampleOkHttp = OkHttpClient.Builder()
        .setUnsafe()
        .readTimeout(5, TimeUnit.MINUTES)
        .connectTimeout(5, TimeUnit.MINUTES)
        .build()
 
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2025, 13:53
Помогаю со студенческими работами здесь

Запрос retrofit 2 android studio
как в retrofit 2 выполнить такой запрос? или в advanced rest client не могу понять, куда...

Retrofit запрос не получается?
Нужно написать GET запрос для Retrofit'а т.е. запрос на сервер с токеном, не понимаю кук токен в...

Retrofit не получается запрос который работает в Postman'e?
если в постмэн выбрать form-data указать ключ-значение и сделать запрос то все ок , но если...

Отправка данных на сервер используя Retrofit
Доброе утро. Нужно отправить данные на сервер. Нужна ваша помощь. Вот те классы которые я смог...

retrofit. попытка соединения с другим сервером, если основной недоступен
Привет. У меня есть 2 внешних интернет канала. Мне нужно сделать так, что бы при недоступности...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru