Android
[Android/Kotlin] javax.net.ssl.SSLPeerUnverifiedException: Hostname not verified 오류 해결
coco_keh
2022. 7. 23. 02:48
retrofit을 사용하여 aws에 올려놓은 spring 서버와 연결하는 중에 제목과 같은 오류가 떴다.
구글링 해보니 해당 문제는 안드로이드가 보안의 강화로 연결을 막는 경우였다. 정확히 말하자면 신뢰가 불가능한 서버라고 판단되면 호출을 하지 못하게 하는 것이다.
이것을 해결하기 위해 OkHttpClient에 hostnameVerifier를 이용해서 HTTPS conn에 대한 response 인증이 request hostname에 적용되는지 확인하는 데 사용되는 verifier를 설정했다.
val client: OkHttpClient = OkHttpClient.Builder()
.addInterceptor(interceptor)
.hostnameVerifier(
HostnameVerifier { hostname, session ->
val hv = HttpsURLConnection.getDefaultHostnameVerifier()
hv.verify("cn명", session)
}).build()
cn명이라고 써져있는 부분에는 Logcat Debug에 나오는 해당 부분을 찾아서 적어주면 된다. 서버
Hostname 옆에 지운 부분에는 base url에 넣어놓은 서버 ip가 들어가있다.
retrofit build 코드 전체는 아래와 같다.
fun getRetrofit(): Retrofit {
val interceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
val client: OkHttpClient = OkHttpClient.Builder()
.addInterceptor(interceptor)
.hostnameVerifier(
HostnameVerifier { hostname, session ->
val hv = HttpsURLConnection.getDefaultHostnameVerifier()
hv.verify("cn명", session)
}).build()
val gson: Gson = GsonBuilder().setLenient().create()
val retrofit = Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build()
return retrofit
}