Java setProperty "https.protocols", "TLSv1.2" для одного вызова REST - PullRequest
0 голосов
/ 22 февраля 2019

В настоящее время я должен использовать Java 7 (не могу изменить его atm), и версия TLS по умолчанию - 1.0 (?), Поэтому ниже 1.2.И теперь я должен использовать REST Api, который не принимает TLS ниже TLSv1.2.

Так что мое решение для этого было:

До вызова 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:

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

Теперь мой вопрос: есть ли альтернативный способ установить свойство "https.protocols", поэтому мне не нужно устанавливать его в System?

Иначе я сомневаюсь, что это свойство System влияет на вызовы REST из других классов, которые были выполнены одновременно.

1 Ответ

0 голосов
/ 22 февраля 2019

Я полагаю, что вы можете установить протокол TLS на вашем HttpsURLConnection напрямую, и таким образом он будет применяться только локально к этому одному соединению.

Сначала инициализируйте ваш 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 ():

"Любой из первых двух параметров может быть нулевым, и в этом случае в установленных провайдерах безопасности будет производиться поиск наивысшего приоритета для соответствующей фабрики.безопасный случайный параметр может быть нулевым, и в этом случае будет использоваться реализация по умолчанию. "

Впоследствии просто установите этот SSLContext для HttpsURLConnection:

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) {
        }
    }
};
...