【发布时间】:2021-10-21 06:29:51
【问题描述】:
我已经弄清楚如何使用 EmbeddedServer Jetty 启动 ktor 并使用我自己的签名证书(由我自己的自签名 rootCA 证书签名)提供 https/ssl/tls。
现在 ktor sslConnector 需要将 keyStorePath 设置为 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 容器无关)
第二个问题:是否可以启用 mutual tls,以便在客户端无法提供有效证书时 ktor 服务器拒绝连接?如果是,我将如何配置?
【问题讨论】:
-
我不知道 ktor,但在 Java 中,您可以(仍然)使用 pre-9 方式从 jar 资源加载 KeyStore:
x = KeyStore.getInstance("PKCS12"); x.load( whatever.getResourceAsStream("/blah"), pw_chararray)(并关闭逻辑要整洁)。同样在 Java 中,SSLSocket/SSLEngine.setNeedClientAuth(true)或.setSSLParameters(containing_same)中止,如果没有或错误的客户端证书,但我不知道 ktor。 PS:openssl pkcs12 -export忽略了-nodes——这仅适用于相反的“解析”模式。
标签: kotlin ssl embedded-resource ktor mtls