首页 文章

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

提问于
浏览
1

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

线程“main”中的异常javax.net.ssl.SSLProtocolException:握手警报:sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1410)中的sunrecognized_name at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java :2004)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级别上执行此操作?

Code

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

httpConnection.connect();

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

2 回答

  • 0

    显然,该站点依赖于SNI,否则它不会关心客户端在SNI扩展中发送的名称 . 这意味着禁用扩展可能没有帮助,但是你会得到一些握手失败或一些默认站点(和证书),可能不是你想要的站点 . 要解决此问题,您不应禁用SNI,而应使用正确的名称,即站点所需的名称 .

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

相关问题