SSL连接握手Java 8无法正常工作

时间:2018-10-10 19:20:35

标签: java ssl

我有以下简单的代码来建立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。但是,无法通过系统属性设置代理设置。

2 个答案:

答案 0 :(得分:2)

我认为Java 8中的代理检测似乎不适合您。假设检测到Java 10是正确的,请尝试通过系统属性配置代理  (用于HTTPS连接)。

System.setProperty(“https.proxyHost“, “<proxy host>”);
System.setProperty(“https.proxyPort“, “<proxy port>”);

答案 1 :(得分:0)

我不是Java专家。但是对我来说,您的问题基本上可以归结为:

  • 如果不使用代理(可能是由于防火墙)导致无法正常工作
  • 如果使用代理,则可以(至少在Java 10中有效)
  • 但是您不能使其在Java 8中使用代理-至少与Java 10中使用代理的方式不同

Java Networking and Proxies中介绍了如何在Java 8中设置代理。根据文档,Java 8似乎也支持java.net.useSystemProxies。因此,可能是您在不同的系统(因此Java版本不同)上执行了程序,而一个系统设置了正确的系统代理,而另一个系统则没有。