我有以下简单的代码来建立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握手。
主,写:TLSv1.2握手,长度= 214,主等待 close_notify或alert:状态1线程“ main”中的异常 java.net.SocketException:连接重置于 java.net.SocketInputStream.read(SocketInputStream.java:209)在 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.waitForClose(SSLSocketImpl.java:1769) 在 sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:124) 在sun.security.ssl.Handshaker.kickstart(Handshaker.java:1020)处 sun.security.ssl.SSLSocketImpl.kickstartHandshake(SSLSocketImpl.java:1487) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1351) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 在com.hlcl.exp.Main.main(Main.java:18)main上,等待时发生异常 用于关闭java.net.SocketException:连接重置主程序,处理 异常:java.net.SocketException:连接重置主,SEND TLSv1.2警报:致命,描述=意外消息主,写: TLSv1.2警报,长度= 2个主要消息,异常发送警报: java.net.SocketException:对等体重置连接:套接字写入错误 主要,称为closeSocket()
如果我在Java 10环境中执行相同的代码,它将起作用。
我已经检查了java检测到的代理。在Java 8下,检测到DIRECT(无代理)连接。使用Java 10,将检测以下代理设置。
代理类型:HTTP
代理主机名:ipv4.178.3.225.226.webdefence.global.blackspider.com
代理端口:8081
如果我删除了System.setProperty("java.net.useSystemProxies", "true");
或将其设置为false,它也不适用于Java10。但是,无法通过系统属性设置代理设置。
答案 0 :(得分:2)
我认为Java 8中的代理检测似乎不适合您。假设检测到Java 10是正确的,请尝试通过系统属性配置代理 (用于HTTPS连接)。
System.setProperty(“https.proxyHost“, “<proxy host>”);
System.setProperty(“https.proxyPort“, “<proxy port>”);
答案 1 :(得分:0)
我不是Java专家。但是对我来说,您的问题基本上可以归结为:
Java Networking and Proxies中介绍了如何在Java 8中设置代理。根据文档,Java 8似乎也支持java.net.useSystemProxies
。因此,可能是您在不同的系统(因此Java版本不同)上执行了程序,而一个系统设置了正确的系统代理,而另一个系统则没有。