问题描述
String url1 = "foo1.blabla.com";
String url2 = "foo2_bar.blabla.com";
URLConnection urlConnection = new URL(url1).openConnection();
urlConnection.setDoInput(true);
//Fails
InputStream in = urlConnection.getInputStream();
我们能够毫无问题地连接url1,但是他们最近将其url更改为url2,并声称他们仅更改了url,而没有其他更改。但是修改之后,我得到了以下例外:
java.net.SocketException:连接重置 在java.net.SocketInputStream.read(SocketInputStream.java:210) 在java.net.SocketInputStream.read(SocketInputStream.java:141) 在sun.security.ssl.InputRecord.readFully(InputRecord.java:465) 在sun.security.ssl.InputRecord.read(InputRecord.java:503) 在sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) 在sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) 在sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) 在sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379) 在sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
-
我尝试过Java 1.8.181、1.8.191。
-
我尝试使用customhostnameverifier之类的
CustomHostNameVerifier类实现了HostnameVerifier {
public CustomHostNameVerifier() { } @Override public boolean verify(String arg0,SSLSession arg1) { return true; }
}
-
url1和url2都具有相同的证书信息,我还使用keytool将它们的.cer添加到了密钥库中。
-
由于我可以使用邮递员连接到url2,所以在同一台计算机上没有防火墙或防病毒问题。我在Java代码中添加了类似邮递员的标头。
-
我检查了以下页面:
java.net.SocketException: Connection reset With HTTPConnection
What's causing my java.net.SocketException: Connection reset?
java.net.SocketException: Connection reset
connection reset on HttpsUrlConnection with valid URL
- 我用 -Djavax.net.debug = ssl:握手:详细:keymanager:trustmanager -Djava.security.debug = access:stack
并查看以下差异:
用于url1(正常工作)
SendHTTPTest.f9()连接已打开允许不安全的重新协商:false 允许旧式问候消息:true初始握手:true安全 重新协商:false main,SNI中的先前服务器名称 (type = host_name(0),value = foo1.blabla.com )被替换为(type = host_name (0),value = foo1.blabla.com )扩展名Extended_master_secret扩展名 服务器名称,服务器名称:[类型=主机名称(0),值= foo1.blabla.com ]] ***主,写:TLSv1.2握手,长度= 226主,读:TLSv1.2握手,长度= 2303 *** ServerHello,TLSv1.2
用于url2(连接重置问题)
SendHTTPTest.f9()连接已打开 主要,“ foo2_bar.blabla.com”不是用于指示服务器名称的合法主机名。允许不安全的重新协商:否允许旧的hello消息:true是 初始握手:true是安全重新协商:false 主要,“ foo2_bar.blabla.com”不是用于表示服务器名称的合法主机名 main,写:TLSv1.2握手,长度= 193 main,处理异常: java.net.SocketException:连接重置主体,发送TLSv1.2警报: 致命的,描述=意想不到的消息主消息,写信:TLSv1.2警报, length = 2 main,发送警报的异常:java.net.SocketException: 对等方重置连接:套接字写错误主程序,称为 closeSocket()java.net.SocketException:连接重置
该消息可能导致主要,“ foo2_bar.blabla.com”不是用于服务器名称指示的合法主机名问题,这与SNI有关吗? url2中的下划线可能会引起问题吗?
SNI client-side mystery using Java8
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)