【发布时间】:2015-11-11 03:07:34
【问题描述】:
我目前有一个应用程序可以向许多 URL 发出 HTTP 发布请求。一些连接失败,但出现以下异常。
线程“主”javax.net.ssl.SSLProtocolException 中的异常: 握手警报:unrecognized_name at 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 的内容
【问题讨论】:
-
另一个问题将阐明设置 jsse 系统属性的安全问题。如果该方法没有高安全风险,这个问题将很有用。
-
根据我拥有并由 javap 为 7u80 和 8u51 验证的稍旧的源代码,
sun.security.ssl.ClientHandshaker中的private final static boolean enableSNIExtension仅在加载类时初始化,并且有没有 API 可以改变它。未经测试,但假设您不在 SecurityManager(例如浏览器小程序)下,它应该使用反射来暂时破坏它。如果任何其他线程可以同时执行(客户端)SSL/TLS,则需要互斥;在ClientHandshaker.class上同步简单明了。
标签: java ssl httpurlconnection sslexception