Как заставить java-сервер принимать только tls 1.2 и отклонять tls 1.0 и tls 1.1 соединения
У меня есть веб-служба https, работающая на java 7. Мне нужно внести изменения, чтобы эта служба только принимала соединение tls1.2 и отклоняла ssl3, tls1.0 и tls1.1.
Я добавил следующий параметр java, чтобы tls1.2 был наивысшим приоритетом.
-Dhttps.protocols=TLSv1.2
но также принимает соединения tls1.0 от java-клиентов. если клиент также работает с указанным выше параметром java, соединение равно tls1.2, но если клиент работает без этого параметра, соединения будут tls1.0.
Я немного поиграл с файлом java.security в папке jdk/jre/lib/security.
В настоящее время у меня есть следующие отключенные алгоритмы:
jdk.certpath.disabledAlgorithms= MD2, MD4, MD5, SHA224, DSA, EC keySize < 256, RSA keySize < 2048, SHA1 keysize < 224
jdk.tls.disabledAlgorithms=DSA, DHE, EC keySize < 256, RSA keySize < 2048, SHA1 keysize < 224
Я использую java 7, обновление 79. Я не склонен к перехвату каждого соединения и проверке версии tls.
Мой сертификат сервера составляет 2048 бит, сгенерированный с помощью MD5 с алгоритмом RSA.
Если список отключенных алгоритмов имеет RSA вместо RSA keySize < 2048, я получаю сообщение SSLHandShakeError с сообщением об ошибке: нет общих наборов шифров.
Моя тестовая программа запускает http-сервер из следующего URL-адреса:
http://www.herongyang.com/JDK/HTTPS-HttpsEchoer-Better-HTTPS-Server.html
пожалуйста, помогите, как заставить java принимать только соединения tls 1.2.
Ответы
Ответ 1
Я нашел решение для этого. Я установил
jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSv1.1
в файле jre/lib/security/java.security на сервере.
После этого сервер принимает только соединение TLS1.2 и отклоняет более низкие версии протокола безопасности.
Ответ 2
Просто небольшое замечание;
В вопросе вы заявили, что вы создали сертификат размера 2048 с MD5. Но в пути cert alg вы отключили MD5, поэтому это нормально не должно работать. Во-вторых, сертификаты сервера, созданные с использованием хеша MD5, запрещены из современных браузеров, таких как Internet Explorer 10/Edge.
Я хотел бы посоветовать вам создать сертификат сервера, по крайней мере, с помощью SHA256 или < хэш.
Ответ 3
Я также сделал те же изменения в файле /java/jdk1.7.0_79/jre/lib/security"-java.security, но некоторые из клиентов по-прежнему могут вызывать мои службы с помощью протокола SSL.
----Changes jdk.tls.disabledAlgorithms = SSL, SSLv2, SSLv3, TLSv1, TLSv1.1, MD5, SSLv3, DSA, RSA keySize <2048