Java - Как я могу отключить шифр TLS только для некоторых протоколов, используя JVM Config? - PullRequest
0 голосов
/ 12 октября 2018

Я видел множество примеров отключения шифров TLS в java с использованием jdk.tls.disabledAlgorithms , например:

 jdk.tls.disabledAlgorithms=MD2, RSA keySize < 1024, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Но как я могу отключитьшифровать только определенные протоколы, используя jdk.tls.disabledAlgorithms или аналогичный конфиг?

Например, как отключить TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 только для TLSv1.1?

Некажется, поддерживает opensssl способ сделать это, который выглядит так:

TLSv1.1:!TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Это не вызывает никаких ошибок, но шифр все еще разрешен.

РЕДАКТИРОВАТЬ: Обратите внимание, что яЯ действительно заинтересован только в ответах на основе конфигурации JVM, так как я не контролирую код, который есть на многих из этих серверов, а только в конфигурациях JVM и JVM.Некоторые даже являются сторонними серверами, так что это скорее уровень опса, чем что-либо другое.

РЕДАКТИРОВАТЬ 2: обратите внимание, что вы можете запустить приложение java и предоставить аргументы, которые изменяют используемые протоколы и шифры, например, java -server -Djava.security.properties=./my/custom/java.security -jar myapp.jarбудет делать это - но это не позволит вам фильтровать шифры по протоколу, только шифры или протоколы, из того, что я вижу.Файл будет содержать запись свойства, такую ​​как jdk.tls.disabledAlgorithms

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

изменить lib/security/java.security (может быть в другом месте на основе вашего JDK) и добавить Algorithm к jdk.tls.disabledAlgorithms

В дополнение к этому keySize может использоваться для ограничения более слабых алгоритмов,jdk.tls.disabledAlgorithms=MD2, MD4, MD5, EC keySize < 160, RSA keySize < 2048, DSA keySize < 2048

Полагаю, вы уже все это знаете и действительно хотите иметь их в каждой версии (в идеале что-то вроде jdk.tls11.disabledAlgorithms), однако я не знаю ни одного такого мелкозернистого свойства.

Однако версия протокола может быть ограничена как таковая jdk.tls.client.protocols=TLSv1.1

Если вы хотите поддерживать TLSv1.1 и TLSv1.2, хорошей стратегией будет поддержка только этих алгоритмов (или настройка keySize алгоритмов) так что они будут сильны в обеих версиях TLS.

Для справки: https://www.java.com/en/configure_crypto.html

0 голосов
/ 22 октября 2018

Публикация моего комментария в качестве ответа, потому что почему бы и нет.

Другие ответы и каждый документ, который я нашел в Интернете, похоже, согласны с тем, что то, о чем вы просите, невозможно сделать в Java, пока нетпо крайней мере.Вы можете включить / отключить протоколы глобально, и вы можете включить / отключить типы шифров глобально, но вы не можете сделать один на основе другого.

Однако, поскольку вы находитесь на стороне DevOps, возможно, решение не от Java.возможно.Вы можете запустить отдельные экземпляры приложения, в каждом из которых включен только TLSv1.1, только TLSv1.2 и т. Д., И применить требуемый шифровальный фильтр к каждому из них;а затем nginx (или любой другой используемый вами) перенаправляет трафик на соответствующий экземпляр в зависимости от обнаруженного протокола.

Итак, один экземпляр в NODE1 с:

jdk.tls.client.protocols=TLSv1.1
jdk.tls.disabledAlgorithms=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Другой экземпляр в NODE2 с:

jdk.tls.client.protocols=TLSv1.2
jdk.tls.disabledAlgorithms=...

И некоторые правила nginx (используйте return или rewrite, как считаете нужным):

server {
    [...]
    if ( $ssl_protocol = TLSv1.1 ) {
        return 302 $scheme://NODE1.yourhost.com$request_uri;
    }
    if ( $ssl_protocol = TLSv1.2 ) {
        rewrite ^ $scheme://NODE2.yourhost.com$request_uri;
    }

Я всего лишь разработчик Java, мой опыт работы с nginxочень ограничен, так что вам может понадобиться немного изменить конфигурациюПросто пытаюсь помочь.

0 голосов
/ 15 октября 2018

Документы JSSE говорят, что свойство https.protocols может хранить разделенный запятыми список поддерживаемых протоколов в данном контексте SSL, однако это свойство используется текущей реализацией JSSE, но может игнорироваться другими поставщиками илибудущие версии, поэтому YMMV.

Программно вы можете достичь этого так:

SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket();
socket.setEnabledCipherSuites(new String[] {
    CipherSuite.TLS_RSA_WITH_RC4_128_MD5.javaName,
    CipherSuite.TLS_RSA_WITH_RC4_128_SHA.javaName,
});

//allow TLS1.2 only
socket.setEnabledProtocols(new String[] {
    TlsVersion.TLS_1_2.javaName,
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...