我目前有一个可以对许多URL进行HTTP发布请求的应用程序。某些连接失败,但出现以下异常。
线程“主”中的异常javax.net.ssl.SSLProtocolException:
握手警报:位于无法识别的名称
sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1410)
在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时无法在线找到任何内容
最佳答案
显然,该站点依赖于SNI,否则它将不关心客户端在SNI扩展中发送的名称。这意味着禁用扩展名可能无济于事,但是相反,您将获得一些握手失败或某些默认站点(和证书),而可能不是您想要的站点。要解决此问题,您不应禁用SNI,而应使用正确的名称,即站点期望的名称。
编辑:这看起来像是服务器配置错误以及Java7和Java8中的错误。访问URL https://artofskinmd.localgiftcards.com/
将导致一个unknown_name TLS警报警告,Java7和Java8错误地认为该警告是致命的(与非常老的OpenSSL 0.9.8相同)。在这种情况下,禁用SNI实际上会有所帮助,但是似乎没有办法为单个HttpURLConnection对象禁用SNI。
关于java - 如何仅将单个HTTPURLConnection的“jsse.enableSNIExtension”设置为false?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32068009/