一个REST调用的Java setProperty“ https.protocols”,“ TLSv1.2”

时间:2019-02-22 12:53:25

标签: java https get tls1.2 httpsurlconnection

当前,我必须使用Java 7(无法更改其atm),默认TLS版本为1.0(?),因此低于1.2。现在我必须使用一个不接受TLSv1.2以下的TLS的REST Api。

所以我的解决方案是:

REST调用之前:

System.setProperty("https.protocols", "TLSv1.2"); // Adding this System property only for this one function call. Has to be executed every time before

然后是GET Call本身:

...
URL url = new URL("https://test.com");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
...

现在我的问题是:是否有其他方法可以设置“ https.protocols”属性,因此我不必在系统中进行设置?

此系统属性是否会影响同时执行的来自其他类的REST调用,还不确定。

1 个答案:

答案 0 :(得分:1)

我相信您可以直接在HttpsURLConnection上设置TLS协议,这样,它将仅本地应用到该连接。

首先初始化TLSv1.2 SSLContext

SSLContext sc = SSLContext.getInstance("TLSv1.2");
// Init the SSLContext with a TrustManager[] and SecureRandom()
sc.init(null, trustCerts, new java.security.SecureRandom()); 

有关init()参数的文档:

  

“前两个参数中的任何一个都可以为null,在这种情况下   将搜索安装的安全提供程序的最高优先级   实施适当的工厂。同样,安全随机   参数可以为null,在这种情况下,默认实现为   使用。”

之后,只需在HttpsURLConnection上设置此SSLContext:

httpsCon.setSSLSocketFactory(sc.getSocketFactory());

如果出于调试目的而需要对TrustCert进行全信任(尽管不安全的实现),则可以像这样初始化它并将其用作init()中的第二个参数。
(此实现完全禁用了SSL检查,因此不应在调试/开发情况之外使用)

// Create a trust manager that does not validate certificate chains
TrustManager[] trustCerts = new TrustManager[]{
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};