Raw Sockets の ktor ドキュメント、具体的にはセキュア ソケットに関連する部分 ( 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
しかし、NativePRNGNonBlocking SecureRandom アルゴリズムは 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))
すべてが期待どおりに機能します。
Windows で Ktor Secure Sockets を使用したことがある人はいますか? (残念ながら、Ktor のドキュメントにはまだ長い道のりがあります)。
ありがとう、J