我已经想出了如何使用 EmbeddedServer Jetty 启动 ktor 并使用我自己的签名证书(由我自己的自签名 rootCA 证书签名)提供 https/ssl/tls 服务。
现在 ktor sslConnector 需要keyStorePath
as File
,但我更愿意从最终 fat jar 中的 /a 文件中提供密钥库(主要是为了能够在 kubernetes 集群中运行它)
有没有办法告诉 ktor 将其 jar 文件中嵌入的资源作为 keyStore 获取/读取?
// openssl pkcs12 -export -nodes -passout pass:${keystorePW} -in "domain.cert" -inkey "domain.key" -certfile "intermediateAndRootCAchain.ca" -name "aliasName" -out "webserverKeystore.p12"
val keystore: KeyStore = KeyStore.getInstance(keystoreFile, keystorePW.toCharArray())
@Suppress("UNUSED_PARAMETER")
fun doIt(args: Array<String>) {
val server = embeddedServer(Jetty, applicationEngineEnvironment {
module {
configureRouting()
configureHTTP(sslPort)
configureSerialization()
}
connector {
this.host = host // redirected to https
this.port = port // redirected to sslPort
}
sslConnector(keystore,
keyAlias = certAlias, // alias name inside keystore: keytool -v -list -keystore certs/keystore.jks
keyStorePassword = { keystorePW.toCharArray() },
privateKeyPassword = { keystorePW.toCharArray() } // somehow this is the same as keystorePW if using openssl pkcs12 -export from above
) {
this.port = sslPort
keyStorePath = keystoreFile
}
})
server.start(wait = true)
}
有没有办法告诉 ktor 将其 jar 文件中嵌入的资源作为 keyStore 获取/读取?
(还想知道为什么sslConnector
仍然需要密钥库,就File
好像它已经将整个密钥库作为第一个参数一样,但这可能与正在使用的实际 Web 容器无关)
第二个问题:是否可以启用双向 tls,以便在客户端无法提供有效证书时 ktor 服务器拒绝连接?如果是,我将如何配置?