Ограничить наборы шифров на уровне JRE
Наше Java-приложение предоставляет множество различных интерфейсов (SMTP, FTP, HTTP), защищенных с помощью SSL/TLS. Теперь цель состоит в том, чтобы ограничить наборы шифров, разрешенные на этих интерфейсах, только "сильными". У меня уже есть список, и понятно, как заставить его работать на конкретном сокете
socket.setEnabledCipherSuites(ENABLED_SECURE_CIPHER_SUITES);
или для разъема Tomcat
<Connector port="443" ciphers="..."/>
Проблема в том, что в приложении уже есть 5 мест, где я должен применить это ограничение вручную. Common SocketFactory, похоже, не помогает, поскольку не всегда возможно предоставить собственный SocketFactory для стороннего API или фреймворка. Можно ли как-то ввести это ограничение на уровне JRE, например, с помощью конфигурации провайдеров JCE или файла политики?
JRE: Oracle JRE 1.7.0_17
1 ответ
Ну, мне удалось заставить это работать. Спасибо EJP за указание в правильном направлении. Начиная с Java 1.7 в $JRE_HOME/lib/security/java.security есть два дополнительных свойства:
jdk.certpath.disabledAlgorithms=MD2
Алгоритмы управления для построения и валидации пути сертификации.
jdk.tls.disabledAlgorithms=MD5, SHA1, RC4, RSA keySize < 1024
Ограничения алгоритма JVM для обработки SSL/TLS, который я искал. Запись здесь совершенно очевидна; можно запретить определенные алгоритмы или ограничить размеры ключей. Оба свойства поддерживаются в Oracle JRE 7, Open JRE 7 и (что удивительно) IBM Java v7