我有以下简单的代码来建立SSL连接。
public static void main(String[] args) throws IOException {
System.setProperty("javax.net.debug", "ALL");
System.setProperty("java.net.useSystemProxies", "true");
URL url = new URL("https://google.com");
URLConnection con = url.openConnection();
try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
如果我在Java 8下运行这段代码,它就不能工作。它在开始使用java.net.SocketException: Connection reset
进行SSL握手时停止。
main,写入: TLSv1.2握手,长度= 214 main,正在等待close_notify或警报:线程“java.net.SocketException”中出现状态1异常:在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:973)在sun.security.ssl.SSLSocketImpl在sun.security.ssl.InputRecord.read(InputRecord.java:503)在sun.security.ssl.InputRecord.readFully(InputRecord.java:465)在java.net.SocketInputStream.read(SocketInputStream.java:209)重置连接sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:124) at sun.security.ssl.Handshaker.kickstart(Handshaker.java:1020) at sun.security.ssl.SSLSocketImpl.kickstartHandshake(SSLSocketImpl.java:1487) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1351) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at sun.net.www.protocol的.waitForClose(SSLSocketImpl.java:1769).https.HttpsClient.afterConnect(HttpsClient.java:563) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at com.hlcl.exp.Main.main(Main.java:18) main,等待关闭时出现异常java.net.SocketException:连接重置主要,处理异常: java.net.SocketException:连接重置主要,发送TLSv1.2警报:致命,描述= TLSv1.2主要,写入:TLSv1.2警报,长度=2主要,发送警报异常: java.net.SocketException:连接由对等设备重置:套接字写入错误主要,调用closeSocket()
如果我在Java10环境中执行相同的代码,它可以工作。
我已经检查了java检测到的代理。在Java 8下,会检测到直接(无代理)连接。在Java 10中,会检测到以下代理设置。
代理类型: HTTP代理主机名:ipv4.xxx.com代理端口: 8081
如果我删除System.setProperty("java.net.useSystemProxies", "true");
或将其设置为false,它也不适用于Java10,但是通过系统属性设置代理设置不起作用。
发布于 2018-10-11 04:34:49
我认为Java 8中的代理检测似乎不适合您。假设对Java10的检测是正确的,尝试通过系统属性配置您的代理(用于HTTPS连接)。
System.setProperty("https.proxyHost", "<proxy host>");
System.setProperty("https.proxyPort", "<proxy port>");
发布于 2018-10-11 04:04:59
我不是Java专家。但对我来说,你的问题基本上可以归结为:
的方式不同
在Java Networking and Proxies中记录了如何在Java8中设置代理。根据文档,Java8似乎也支持java.net.useSystemProxies
。因此,您可能在不同的系统上执行您的程序(因此是不同的Java版本),并且一个系统设置了适当的系统代理,而另一个没有。
https://stackoverflow.com/questions/52747377
复制相似问题