1

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

线程“主”javax.net.ssl.SSLProtocolException 中的异常:握手警报:unrecognized_name at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1410) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java: 2004) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) 在 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 的内容

4

2 回答 2

2

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

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

于 2015-08-18T13:09:15.477 回答
0

请参阅 Java jar - 没有主要清单属性

而这个提交

https://github.com/Lekensteyn/OWASP-WebScarab/commit/8f2362eb021924cece9fb544f04bde5da7bfed4a

于 2016-01-21T19:53:14.673 回答