hik14 2022. 7. 18. 12:12

Ktor 클라이언트에서 SSL을 구성하려면 클라이언트에서 사용하는 엔진 구성을 사용자 정의해야 합니다.

 JVM 엔진에 대한 SSL 인증서를 추가하는 방법 확인.

 

SSL 이란

 

넷스케이프에서 처음 만들어진 SSL(secure socket Layer) 프로토콜은 사실 현재 TLS(Transfer Layer Security)라고 불립니다. SSL은 과거에 사용했던 명칭이라고 하네요. 또한 컴퓨터 네트워크에 통신보안을 적용하기 위해 설계된 암호 프로토콜입니다. 이 프로토콜은 TCP/IP 네트워크를 사용하는 통신에 적용되며, 웹 서버와 브라우저 사이의 종단 간 보안과 데이터 무결성을 보증합니다. 흔히 다들 'SSL 암호화 통신'이라고 부르기도 합니다.

 

우리가 많이 접하는 브라우저의 url에서 https를 많이 보셨을 거예요. 이는 위에서 언급한 SSL이 적용된, 즉 암호화 통신을 하고 있다는 것입니다. 이렇게 우리가 모르는 사이에 많은 사이트에서 적용되고 있습니다. 또한 데이터를 암호화시켜, 인증된 사용자가 아닌 이상 전송되고 있는 데이터를 볼 수 없습니다.

 Load SSL settings

Ktor 클라이언트는 서버용으로 생성된 기존 KeyStore 파일(keystore.jks)에서 로드된 인증서를 사용합니다. 

서로 다른 Engine이 각 각의  JSSE(Java Secure Socket Extension) API를 사용하여 SSL을 구성한다는 점을 감안할 때(예: Apache의 경우 SSLContext 또는 Jetty의 경우 TrustManager) 해당 SSL Configuration을 얻을 수 있는 기능이 필요합니다.

 

기존 KeyStore 파일(keystore.jks)에서 인증서를 로드하고 SSL 구성을 로드하기 위한 기능을 제공하는 SslSettings 객체를 생성.

object SslSettings {
    fun getKeyStore(): KeyStore {
        val keyStoreFile = FileInputStream("keystore.jks")
        val keyStorePassword = "foobar".toCharArray()
        val keyStore: KeyStore = KeyStore.getInstance(KeyStore.getDefaultType())
        keyStore.load(keyStoreFile, keyStorePassword)
        return keyStore
    }

    fun getTrustManagerFactory(): TrustManagerFactory? {
        val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
        trustManagerFactory.init(getKeyStore())
        return trustManagerFactory
    }

    fun getSslContext(): SSLContext? {
        val sslContext = SSLContext.getInstance("TLS")
        sslContext.init(null, getTrustManagerFactory()?.trustManagers, null)
        return sslContext
    }

    fun getTrustManager(): X509TrustManager {
        return getTrustManagerFactory()?.trustManagers?.first { it is X509TrustManager } as X509TrustManager
    }
}