Пример Windows Ktor Secure Sockets (SSL / TLS)? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытался следовать документации ktor для Raw Sockets и, в частности, части, относящейся к защищенным сокетам (https://ktor.io/servers/raw-sockets.html):

runBlocking {
    val socket = aSocket(ActorSelectorManager(ioCoroutineDispatcher)).tcp().connect(InetSocketAddress("google.com", 443)).tls()
    val w = socket.openWriteChannel(autoFlush = false)
    w.write("GET / HTTP/1.1\r\n")
    w.write("Host: google.com\r\n")
    w.write("\r\n")
    w.flush()
    val r = socket.openReadChannel()
    println(r.readUTF8Line())
}

You can adjust a few optional parameters for the TLS connection:

suspend fun Socket.tls(
        trustManager: X509TrustManager? = null,
        randomAlgorithm: String = "NativePRNGNonBlocking",
        serverName: String? = null,
        coroutineContext: CoroutineContext = ioCoroutineDispatcher
): Socket

Но алгоритм SecureRandom NativePRNGNonBlocking недоступенв Windows, поэтому мой единственный вариант - использовать SHA1PRNG (https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SecureRandomImp)

Это код, который я использую для подключения к сокету прослушивания:

socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(InetSocketAddress(host, port))
    .tls(Dispatchers.IO, randomAlgorithm = "SHA1PRNG")

К сожалению, я всегда получаю одну и ту же ошибку: " Канал был закрыт "

Если я удаляю tls, сохраняя только необработанный сокет:

socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(InetSocketAddress(host, port))

Все работает как положено.

Кто-нибудь использовал Ktor Secure Sockets в Windows? (К сожалению, документации Ktor еще предстоит пройти долгий путь).

Спасибо, J

...