java - 如何仅为单个 HTTPURLConnection 将 “jsse.enableSNIExtension” 设置为 false?

标签 java ssl httpurlconnection sslexception

我目前有一个应用程序可以向很多 URL 发出 HTTP post 请求。某些连接失败,出现以下异常。

Exception in thread "main" javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1410) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2004) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)

. . .

因此,我只想为抛出上述异常的特定连接将“jsse.enableSNIExtension”设置为 false。

如何在 HTTPsURLConnection/SSLSocket 级别上执行此操作?

代码

URL url = new URL("https://artofskinmd.localgiftcards.com/");
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();

httpConnection.connect();

我正在尝试找到一种方法来更改 HttpsURLConnection 对象的 SSLParameters。但是我找不到任何用于设置空服务器名称列表的 setSSLParameters() 方法。我无法在网上找到任何有关为 HttpURLConnection、SSLContext 等设置 SSLParameters 的内容

最佳答案

很明显该站点依赖于SNI,否则它不会关心客户端在SNI扩展中发送的名称。这意味着禁用扩展可能无济于事,但您可能会遇到一些握手失败或某些默认站点(和证书),而且可能不是您想要的站点。要解决此问题,您不应禁用 SNI,而应使用正确的名称,即站点期望的名称。

编辑:这看起来既是错误的服务器配置,又是 Java7 和 Java8 中的错误。访问 URL https://artofskinmd.localgiftcards.com/ 将导致 unknown_name TLS 警报 warning Java7 和 Java8 错误地认为它是致命的(与非常旧的 OpenSSL 相同0.9.8).在这种情况下禁用 SNI 实际上会有所帮助,但似乎没有办法为单个 HttpURLConnection 对象禁用 SNI。

关于java - 如何仅为单个 HTTPURLConnection 将 “jsse.enableSNIExtension” 设置为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068009/

相关文章:

java - Gradle 不生成 Javadocs

.NET:HttpClient 对象似乎忽略了服务器证书验证的证书颁发机构:我错过了什么吗?

http - ruSTLs HTTP 请求响应 301

android, httpurl连接错误

JAVA 获取带有授权 header 值的请求

java - 从 Superpowered SDK 回调中调用 Java 函数

java - 检索Wicket中表单的动态添加输入的值

java - jqGrid 未填充来自 Java Servlet 的 JSON 数据

django - 使用 SSL (https) 的网络服务的 Nginx 设置

java - 我必须从服务器获取响应码吗?