[英]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 網絡和代理中記錄了如何在 Java 8 中設置代理。 根據文檔,Java 8 似乎也支持java.net.useSystemProxies
。 因此,您可能在不同的系統上執行程序(因此 Java 版本不同),並且其中一個具有適當的系統代理集,而另一個則沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.