How to configure ssl using KTOR library?

Viewed 1423

I'm looking for a way to configure https for Ktor application.

I've found an official documentation there: https://ktor.io/servers/self-signed-certificate.html Here explained how to add links to certs inside the HOCON config file.

Is it possible to config ssl without config file?

Here's my codebase:

http = embeddedServer(Netty, port = listenPort, configure = {
                connectionGroupSize = 1
                workerGroupSize = 5
            }){
                if(sslCertificate != null) {
                    install(HttpsRedirect) {
                        sslPort = 443
                    }
                }

                install(StatusPages) {
                    exception<NotFoundError> { cause ->
                        logger.error("NotFoundError:", cause.message)
                        call.respondText(cause.message ?: "",
                                ContentType.Text.Plain, HttpStatusCode.NotFound){}
                    }
                    exception<BadFormatError> { cause ->
                        logger.error("BadFormatError:", cause.message)
                        call.respondText(cause.message ?: "",
                                ContentType.Text.Plain, HttpStatusCode.BadRequest){}
                    }
                    exception<UserMistake> { cause ->
                        logger.error("UserMistake:", cause.message)
                        call.respondText(cause.message ?: "",
                                ContentType.Text.Plain, HttpStatusCode.BadRequest){}
                    }
                    exception<OverloadedException> { cause ->
                        logger.error("OverloadedException:", cause.message)
                        call.respondText(cause.message ?: "",
                                ContentType.Text.Plain, HttpStatusCode.ServiceUnavailable){}
                    }
                    exception<Exception> { cause ->
                        logger.error("Exception:", cause.message)
                        call.respondText(cause.message ?: "",
                                ContentType.Text.Plain, HttpStatusCode.InternalServerError){}
                    }
                }
                intercept(ApplicationCallPipeline.Call) {
                    call.response.headers.append(HttpHelper.ACCESS_CONTROL_ALLOW_ORIGIN, "*")
                    call.response.headers.append(HttpHelper.ACCESS_CONTROL_REQUEST_METHOD, "POST, GET, OPTIONS")
                   // call.response.headers.append(HttpHelper.CONTENT_TYPE, "application/json")
                    if(call.request.uri.endsWith("/")) {
                        call.respondRedirect(call.request.uri.dropLast(1))
                    }
                }
            }
            http.start()
1 Answers

It's a bit complex, but possible. You configure this using sslConnector in the environment:


fun main() {
    val environment = applicationEngineEnvironment {
        log = LoggerFactory.getLogger("ktor.application")

        // Here you can the key store and keys configuration
        sslConnector(keyStore, ...)

        module(Application::myModule)
    }

    embeddedServer(Netty, environment, configure = {
        // ...
    })
}

fun Application.myModule() {

}

Related