【问题标题】:How to build a secure (wss://...) websocket server using Kotlin's ktor?如何使用 Kotlin 的 ktor 构建安全的 (wss://...) websocket 服务器?
【发布时间】:2022-01-02 07:59:52
【问题描述】:

我找到了不安全的 ktor websocket 服务器 (ws://...) 的文档:

https://ktor.io/docs/creating-web-socket-chat.html#creating-the-chat-client

我找到了安全 ktor http 服务器的文档 (https://...)

https://github.com/ktorio/ktor-documentation/tree/main/codeSnippets/snippets/ssl-embedded-server

但我似乎无法找到或弄清楚如何提供安全的 ktor websocket 服务器 (wss://...)

我宁愿不要在它前面使用像 nginx 这样的 SSL 反向代理。

编辑:这是代码:

import io.ktor.application.*
import io.ktor.http.cio.websocket.*
import io.ktor.network.tls.certificates.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.websocket.*
import java.io.*

fun main() {
    val keyStoreFile = File("build/keystore.jks")
    val keystore = generateCertificate(
        file = keyStoreFile,
        keyAlias = "sampleAlias",
        keyPassword = "foobar",
        jksPassword = "foobar"
    )

    val environment = applicationEngineEnvironment {
        sslConnector(
            keyStore = keystore,
            keyAlias = "sampleAlias",
            keyStorePassword = { "foobar".toCharArray() },
            privateKeyPassword = { "foobar".toCharArray() }) {
            port = 8443
            keyStorePath = keyStoreFile
        }
        module(Application::module)
    }

    embeddedServer(Netty, environment).start(wait = true)
}

private fun Application.module() {
    install(WebSockets)
    routing {
        get("/") { // works at https://localhost:8443 in Firefox after approving cert
            call.respondText("This is https")
        }
        webSocket("/chat") { // fails at wss://localhost:8443/chat in Websocket js client with "Firefox can’t establish a connection to the server"
            send("This is wss")
        }
    }
}

【问题讨论】:

  • 您可以像配置 HTTP 服务器一样配置它。有关更多信息,请阅读 SSL 和证书文档ktor.io/docs/ssl.html
  • @AlekseiTirman 我试过使用 sslConnector(...),它配置 https 并且可以工作,但似乎对 websocket 没有任何作用。我在我的问题中添加了代码。

标签: kotlin security encryption websocket ktor


【解决方案1】:

问题在于使用自签名证书。我尝试了 Chrome 并将其设置为接受 localhost 上的自签名证书,这很有效。 Firebox 提供的错误消息表明无法建立连接,而实际上它拒绝了证书。

使用 ktor 的安全 websocket 服务器实际上确实像 @AleksiTierman 建议的那样工作。它的配置方式与 https 服务器相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 2011-08-25
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2014-07-21
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多