Java TLS:在客户端握手时禁用SNI

时间:2020-09-23 10:01:56

标签: java kotlin ssl

我正在尝试创建一个不会在客户端握手中发送server_name的JVM HTTP客户端(长话说,但是我正在模拟一个不支持SNI的旧系统)。

设置serverNames SSLParameters并不能解决问题,我仍然可以在Wireshark中看到“服务器名称指示扩展名”。

fun run() {
    val keyStore = keyStore()
    val trustFactory =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    trustFactory.init(keyStore)
    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, trustFactory.trustManagers, null)

    val httpClient = HttpClient.newBuilder()
        .sslContext(sslContext)
        .sslParameters(sslContext.defaultSSLParameters.apply {
            serverNames = null
        })
        .build()

    val request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com/hello"))
        .GET()
        .build()

    httpClient.send(request, HttpResponse.BodyHandlers.ofString())
}

this gist.中的完整代码

如何阻止客户端发送SNI扩展名?

1 个答案:

答案 0 :(得分:1)

如果您不介意将设置应用于整个JVM,请尝试

jsse.enableSNIExtension=false