Рейтинг:0

Как добавить дополнительные наборы шифров на сервер приложений Java?

флаг kz

Я столкнулся с небольшой проблемой при вызове стороннего API из java-приложения. Для внешнего API требуется хотя бы один из следующих шифров:

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

Я следовал инструкциям здесь: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html попытаться обновить доступные шифры на моем сервере приложений. Однако после обновления я все еще не вижу ни одного из перечисленных совместимых шифров.

Я подозреваю, что проблема в том, что на моем сервере работает jdk 1.7. Это устаревшее приложение, поэтому, к сожалению, я не могу перейти на более новый jdk. Есть ли способ добавить эти шифры в мою существующую установку Java?

Обновлять: Я понял, как добавить дополнительные шифры, но, похоже, это не помогло. В моей фабрике сокетов я добавил такой код:

частный сокет acceptOnlyTLS12 (сокет сокета) {
        если (!(экземпляр сокета SSLSocket))
            обратная розетка;
        SSLSocket sslSocket = (SSLSocket) сокет;
        sslSocket.setEnabledProtocols (новая строка [] { "TLSv1.2" });
        List<String> ciphers = new ArrayList<String>(Arrays.asList(sslSocket.getEnabledCipherSuites()));
        ciphers.add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256");
        sslSocket.setEnabledCipherSuites (ciphers.toArray (новая строка [] {}));
        вернуть sslSocket;
    }

Есть ли еще один шаг, который я где-то пропустил? Есть ли способ получить дополнительную информацию о том, почему рукопожатие ssl не работает?

флаг kz
@ Роберт, можешь немного рассказать об этом? Что такое внешний сервер терминации TLS?
флаг in
https://en.wikipedia.org/wiki/TLS_termination_proxy
флаг in
Насколько я помню, переход с Java 7 на 8 не имел большого значения. Вы пытались запустить его на Java 8? Кроме того, вы по-прежнему можете использовать метод завершения внешнего прокси-сервера, использовать современный веб-сервер, такой как nginx, на том же компьютере, который завершает соединение TLS и перенаправляет теперь незашифрованное соединение на фактический сервер Java.
флаг kz
@ Роберт К сожалению, у меня есть. Приложение работает на Jboss4, который плохо работает с более новыми версиями jdk.
флаг in
Затем вам нужно выбрать внешний сервер терминации TLS.
Рейтинг:1
флаг jp

(1) Эта веб-страница датирована 2014 годом; неограниченная политика больше не используется для версий Oracle Java после 2017 года, а до этого (например, 7u80) это имело значение только для симметричного шифрования более 128 бит что здесь повлияет только на наборы AES256, а не на AES128. (Это было никогда применимо к OpenJDK, хотя OpenJDK ниже 8 в основном был доступен только в основных дистрибутивах Linux, таких как RedHat и Debian, которые могли выделить персонал для сборки и упаковки; вы не говорите, что вы используете.)

(2) Ява (1.)7 делает поддерживать шифровальные наборы CBC, которые вы показываете (не GCM, а для версий Oracle ниже 7u171, AES256 требуют неограниченной политики), но ТОЛЬКО при TLS1.2 (эти наборы шифров не существовали в протоколах более низких версий) и по умолчанию j7 отключает клиентскую часть TLS1.2 (и 1.1).

Если вы явно выполняете подключение к этому API с помощью HttpsURLConnection (например. новый URL("https://что-то").openConnection()) вы можете настроить socketfactory для использования SSLContext.getInstance("TLSv1.2") и/или явно setEnabledProtocols на розетке. Если вы используете другое промежуточное ПО, например. Apache HttpComponents обычно имеют похожие методы, но они различаются в деталях; вам нужно будет показать нам код, и он, вероятно, будет принадлежать StackOverflow, а не здесь. Если вы вызываете библиотеку, которая выполняет внутреннее соединение, у нее могут быть параметры или нет. Для всех или многих методов вызова вы можете изменить значения по умолчанию, например SSLContext.setDefault() или же HttpsURLConnection.setDefaultSSLSocketFacfory() если эти значения по умолчанию не переопределяются в соответствующем коде и внесение такого глобального изменения не создает проблем для чего-либо еще, работающего в той же JVM.

В качестве альтернативы (и многое другое по теме!), Если у вас достаточно недавнее обновление j7, я почти уверен, что они перенесли системное свойство jdk.tls.client.протоколы который вы можете установить, например. TLSv1, TLSv1.1, TLSv1.2 изменить значение по умолчанию без изменения кода (но опять же, только если оно не переопределено и не вредит чему-либо еще). Я не помню точно, когда это было, но определенно после 7u80, поэтому у вас было бы это только с платной поддержкой Oracle или OpenJDK, поддерживаемым кем-то еще за плату или бесплатно. Это легко попробовать и май работай.

флаг kz
@ dave_thompson_085 Мне удалось установить более новую версию jdk7 и добавить банки JCE неограниченной мощности. Некоторые из необходимых шифров, по крайней мере, доступны сейчас, но они не включены. Любая идея, как настроить, какие шифры включены jdk?
Рейтинг:0
флаг kz

Наконец-то я нашел обходной путь, хотя и немного некрасивый. Я создал отличный скрипт, который делает запрос cURL к внешнему API. Поскольку cURL может использовать самые последние сертификаты, я могу обойти ограничения, связанные со старым JDK. Это kludgy, но это работает.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.