запрос клиента ktor https с подписанным сертификатом - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение сервера Ktor (rest api), работающее с самозаверяющим сертификатом.

Он отлично работает из браузера (после предупреждения и подтверждения), порт 80 перенаправляется на 8443.

Но если я попробую это с клиента Ktor Apache:

fun main(args: Array<String>) = runBlocking {

    val client = HttpClient(Apache) {
        install(JsonFeature) {
            serializer = GsonSerializer()
        }
    }

    val job = GlobalScope.launch {
        try {
            //self-signed certificate
            val resultWillFail = client.get<String>("https://10.0.0.11:8443/get-my-services")
            println("${resultWillFail}")
            val resultOk = client.get<String>("https://en.wikipedia.org/wiki/Main_Page") //ok
            println("${resultOk}")
        } catch (e: Exception) {
            println("Error: ${e.message}")
        }
    }

    job.join()
}

Мой запрос к https://10.0.0.11:8443/get-my-services не будет выполнен:

Ошибка: общая проблема SSLEngine

Я тоже пробовал то же самое, используяcurl:

curl: (77) schannel: next InitializeSecurityContext не удалось: SEC_E_UNTRUSTED_ROOT (0x80090325) - цепочка сертификатов была выпущена ненадежным органом.

Так что мой вопрос будет таким: Как использовать самозаверяющий сертификат с клиентом ktor (Apache)?

Спасибо, J

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Исходя из ответа Эрика, я заставил Ktor Apache Client принять самоподписанный сертификат:

fun main(args: Array<String>) = runBlocking {
    val client = HttpClient(Apache) {
        install(JsonFeature) {
            serializer = GsonSerializer()
        }
        engine {
            customizeClient {
                setSSLContext(
                    SSLContextBuilder
                        .create()
                        .loadTrustMaterial(TrustSelfSignedStrategy())
                        .build()
                )
                setSSLHostnameVerifier(NoopHostnameVerifier())
            }
        }
    }

    val job = GlobalScope.launch {
        try {
            val sslGetResult = client.get<String>("https://10.0.0.11:8443/get-my-services")
            println("${sslGetResult}")
        } catch (e: Exception) {
            println("Error: ${e.message}")
        }
    }

    job.join()
}
0 голосов
/ 12 декабря 2018

Вам необходимо настроить Apache HttpClient так, чтобы он игнорировал самозаверяющие сертификаты и передавал их в KTor.Основываясь на информации здесь , вы можете игнорировать самозаверяющую проверку сертификата с помощью следующего кода:

// use the TrustSelfSignedStrategy to allow Self Signed Certificates
val sslContext = SSLContextBuilder
        .create()
        .loadTrustMaterial(TrustSelfSignedStrategy())
        .build()

val allowAllHosts = NoopHostnameVerifier()
val connectionFactory = SSLConnectionSocketFactory(sslContext, allowAllHosts)

val client = HttpClients
        .custom()
        .setSSLSocketFactory(connectionFactory)
        .build() 

Последнее, что вам нужно сделать, это использовать клиент в вашем коде KTor.Я сам еще не пробовал, но дай мне знать, как ты.

...