본문 바로가기

안드로이드 기술 공유

Retrofit으로 SSL 인증서 없이 HTTPS 우회 접속 통신하기!

대부분의 도메인은 SSL이 적용되어 있고, SSL 통신을 하려면 기본적으로는 SSL 인증서가 필요하지만, 간혹 인증서가 만료되었거나 자체 서명된 인증서를 포함하는 도메인인 경우가 있습니다.

 

물론, 신뢰할 수 있는 특정 인증서만 통신을 수락하는 경우가 가장 일반적이며 이상적인 시나리오입니다!

하지만 일반적이지 않은 경우, 이러한 인증서 없이 앱에서 HTTPS 우회 접속 통신이 가능하기 때문에 구현 방법에 대해 소개해드리겠습니다.

 

다시 말씀드리지만, 우회하는 방법보다는 제대로 된 인증 절차를 통한 통신이 가장 좋은 솔루션입니다!

Unsafe OkHttp Client 구현

Retrofit에서 SSL 인증서 체크는 네트워크 모듈에서 이뤄지고 있기 때문에, 우회할 수 있는 OkHttp Client Builder를 구현하겠습니다.

 

/**
 * Retrofit SSL 우회 접속 통신
 */
fun getUnsafeOkHttpClient(): OkHttpClient.Builder {
    val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
        override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {

        }

        override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {

        }

        override fun getAcceptedIssuers(): Array<X509Certificate> {
            return arrayOf()
        }
    })

    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, trustAllCerts, SecureRandom())

    val sslSocketFactory = sslContext.socketFactory

    val builder = OkHttpClient.Builder()
    builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
    builder.hostnameVerifier { hostname, session -> true }

    return builder
}

OkHttpClient 선언

Retrofit 인스턴스를 생성할 때, 위에서 구현한 Unsafe OkHttp Client를 선언해줍니다.

 

Retrofit.Builder()
	.baseUrl(BASE_URL)
        .client(getUnsafeOkHttpClient().build()) //SSL 우회
        .build()

마무리

이렇게 Retrofit으로 SSL 인증서 없이 HTTPS 우회 접속 통신하는 법에 대해 살펴보았습니다. ^^