2017-08-29 526 views
0

我有一個在java 6上運行的遺留應用程序。但是,由於某些安全因素,我們需要升級到TLS 1.2。 爲此,我曾嘗試下面的代碼:Java 6上的TLS 1.2

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.UnknownHostException; 
import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLParameters; 

public class TlsCheck { 

/** 
* test whether this client can connect to TLS v1.2 or not 
*/ 

public static boolean isSuccessfulTLS12connection(){ 
    try{ 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, null, null); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 

     URL url = new URL("https://tlstest.paypal.com"); 
     HttpsURLConnection httpsConnection = (HttpsURLConnection)url.openConnection(); 
     httpsConnection.connect(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(httpsConnection.getInputStream())); 
     StringBuilder body = new StringBuilder(); 
     while(reader.ready()){ 
      body.append(reader.readLine()); 
     } 
     httpsConnection.disconnect(); 
     System.out.println("The body is::"+body.toString()); 
     if(body.toString().equals("PayPal_Connection_OK")){ 
      return true; 
     } 
    }catch(NoSuchAlgorithmException ne){ 
     ne.printStackTrace(); 
    }catch(UnknownHostException ue){ 
     ue.printStackTrace(); 
    }catch(IOException ioe){ 
     ioe.printStackTrace(); 
    }catch(KeyManagementException ke){ 
     ke.printStackTrace(); 
    } 
    return false; 
} 

public static void main(String args[]){ 
    try{ 
     SSLParameters sslParams = SSLContext.getDefault().getSupportedSSLParameters(); 
     System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2"); 
     sslParams.setProtocols(new String[] { "TLSv1.2"}); 
     String[] protocols = sslParams.getProtocols(); 
     System.out.println("The Supported Protocols are::"+Arrays.asList(protocols)); 

    }catch(NoSuchAlgorithmException ne){ 
     ne.printStackTrace(); 
    } 

    if(isSuccessfulTLS12connection()){ 
     System.out.println("The connection to TLS v1.2 endpoint is succesful"); 
    }else{ 
     System.out.println("The connection to TLS v1.2 failed!"); 
    } 
} 

}

,但我得到以下錯誤:

The Supported Protocols are::[TLSv1.2] 
    javax.net.ssl.SSLException: Received fatal alert: protocol_version 
    The connection to TLS v1.2 failed! 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source) 
    at TlsCheck.isSuccessfulTLS12connection(TlsCheck.java:30) 
    at TlsCheck.main(TlsCheck.java:65) 

任何人都可以提出一個更好的辦法,而不是設置屬性?我也嘗試設置JVM參數,但沒有運氣!

回答

0

馬塞爾已經提到的,是Java 6沒有TLS支持也許你可以使用外部軟件,如捲曲作爲一種解決方法,使系統與您的要求。 exec()?

2

真正的修復?升級到Java 1.7或更高版本。繼續運行Java 1.6 Update 45並將其連接到Internet是專業的魯莽。

魯莽如何?非常。

因爲Oracle在四年前發佈了a critical patch update for Java 1.6 Update 45fixed over 40 security vulnerabilities

在這些四年前固定:此漏洞的

  • CVE-2413至62年成功的攻擊會導致未經授權的操作系統包括收購執行任意代碼。
  • CVE-2013-2463易於被利用的漏洞允許通過多種協議成功進行未經驗證的網絡攻擊。成功攻擊此漏洞可能導致未經授權的操作系統接管,包括任意代碼執行。
  • CVE-2013-2464易受攻擊的漏洞允許通過多種協議成功進行未經驗證的網絡攻擊。成功攻擊此漏洞可能導致未經授權的操作系統接管,包括任意代碼執行。
  • CVE-2013-2465易受攻擊的漏洞允許通過多種協議成功進行未經驗證的網絡攻擊。成功攻擊此漏洞可能導致未經授權的操作系統接管,包括任意代碼執行。
  • CVE-2013-2466易受攻擊的漏洞允許通過多種協議成功進行未經身份驗證的網絡攻擊。成功攻擊此漏洞可能導致未經授權的操作系統接管,包括任意代碼執行。
  • CVE-2013-2468易受攻擊的漏洞允許通過多種協議成功進行未經驗證的網絡攻擊。成功攻擊此漏洞可能導致未經授權的操作系統接管,包括任意代碼執行。

而且SIX更是有10.0漏洞等級 - 這意味着它是一個容易利用的遠程漏洞。

這只是Oracle四年前在Java 1.6 Update 45中實際修復的嚴重安全漏洞列表。還有更多的東西在那個仍然存在的補丁中沒有修復。

而你沒有其中任何被修正。

重申:這些漏洞 - and a whole lot more - 在Java 1.6的更新仍然存在45

還是那句話:繼續使用Java 1.6更新45,並將其連接到互聯網是魯莽。 Java 1.6 Update 45有至少25(!!!)已知可遠程利用安全漏洞,CVE得分爲9.3或更高。