簡體   English   中英

SSL連接握手Java 8不起作用

[英]SSL Connection Handshake Java 8 not working

我有以下簡單的代碼來建立 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, WRITE: TLSv1.2 Handshake, length = 214 main, waiting for close_notify or alert: state 1 Exception in thread "main" java.net.SocketException: Connection reset at 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.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) 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: Connection reset main, 處理異常: java.net.SocketException: Connection reset主要,發送 TLSv1.2 警報:致命,描述 = 意外消息主要,寫:TLSv1.2 警報,長度 = 2 主要,異常發送警報:java.net.SocketException:對等方重置連接:套接字寫入錯誤 main,稱為 closeSocket( )

如果我在 Java 10 環境中執行相同的代碼,它就可以工作。

我已經檢查了java檢測到的代理。 在 Java 8 下,檢測到 DIRECT(無代理)連接。 使用 Java 10 可以檢測到以下代理設置。

代理類型:HTTP

代理主機名:ipv4.xxx.xxx.xxx.com

代理端口:8081

如果我刪除System.setProperty("java.net.useSystemProxies", "true"); 或將其設置為 false 它也不適用於 Java 10。但是通過系統屬性設置代理設置不起作用。

我認為 Java 8 中的代理檢測似乎對您不起作用。 假設檢測到 Java 10 是正確的,請嘗試通過系統屬性(用於 HTTPS 連接)配置您的代理。

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

我不是 Java 專家。 但對我來說,你的問題基本上歸結為:

  • 如果沒有使用代理,它就不起作用(可能是因為某些防火牆)
  • 如果使用代理,它可以工作(至少在 Java 10 中)
  • 但是你不能讓它在 Java 8 中使用代理——至少與 Java 10 的方式不同

Java 網絡和代理中記錄了如何在 Java 8 中設置代理 根據文檔,Java 8 似乎也支持java.net.useSystemProxies 因此,您可能在不同的系統上執行程序(因此 Java 版本不同),並且其中一個具有適當的系統代理集,而另一個則沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM