首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SSL连接握手Java 8不工作

SSL连接握手Java 8不工作
EN

Stack Overflow用户
提问于 2018-10-11 03:20:35
回答 2查看 2.5K关注 0票数 3

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-11 04:34:49

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

System.setProperty("https.proxyHost", "<proxy host>");
System.setProperty("https.proxyPort", "<proxy port>");
票数 2
EN

Stack Overflow用户

发布于 2018-10-11 04:04:59

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

  • 如果未使用代理(可能是因为某些防火墙),它将无法工作
  • 如果使用了代理
  • ,它将无法工作(至少在Java 10中是这样),但您无法使其在Java 8中使用代理-至少与Java 10

的方式不同

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52747377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档