Используйте шифры, отличные от GCM, перечисленные для исправления Tomcat на https://weakdh.org/sysadmin.html есть опечатки?
Под заголовком «Apache Tomcat» и под текстом «В файле server.xml (для JSSE)» находится следующая конфигурация шифров коннектора.
Мой вопрос касается нижних 14 шифров (шифров, в названии которых нет GCM)
(Добавлены новые строки для удобства чтения)
<Connector ciphers="[GCM Ciphers],
TLS_ECDHE_RSA_WITH_AES_128_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_SHA,
TLS_ECDHE_RSA_WITH_AES_256_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_SHA,
TLS_ECDHE_ECDSA_WITH_AES_256_SHA,
TLS_DHE_RSA_WITH_AES_128_SHA256,
TLS_DHE_RSA_WITH_AES_128_SHA,
TLS_DHE_DSS_WITH_AES_128_SHA256,
TLS_DHE_RSA_WITH_AES_256_SHA256,
TLS_DHE_DSS_WITH_AES_256_SHA,
TLS_DHE_RSA_WITH_AES_256_SHA
" />
Следует ли использовать эти шифры CBC?
<Connector ciphers="[GCM Ciphers],
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
" />
Кажется, что в именах отсутствует CBC_.
Пример:
TLS_DHE_RSA_WITH_AES_256_SHA должен быть TLS_DHE_RSA_WITH_AES_256_CBC_SHA. В соответствии с https://www.openssl.org/docs/apps/ciphers.html, второе существует, а первое - нет.
Если вы посмотрите на другие исправления на weakdh.org site, вы можете увидеть, что другие продукты используют другое соглашение об именах шифров. Используя список шифров OpenSSL, вы можете сопоставить эти имена с именами, которые использует Tomcat, и узнать, что они сопоставлены с шифрами CBC.
Я пробовал использовать шифры из weakdh.org как опубликовано в моем server.xml, но это не повлияло. Похоже, что Tomcat игнорирует шифры, если хотя бы один шифр написан с ошибкой или не является допустимым именем шифра, и Tomcat возвращается к использованию шифров JVM по умолчанию. Как только я добавил CBC_ к именам шифров, Tomcat начал использовать шифры, перечисленные в атрибуте Connector ciphers.
Есть ли опечатки в решении weakdh.org или я что-то упускаю?
Шифры с weakdh.org кажутся недействительными для вашей системы, поэтому да, он возвращается к значениям по умолчанию. Те, которые перечислены на weakdh.org, могут работать в какой-то другой системе, на которой они тестировали, или они могут быть полностью неправильными, я не могу быть полностью уверен, но я точно знаю, что их нет в списке Вот, поэтому они, вероятно, нигде не действуют.
Чтобы получить список допустимых комплектов шифров для вашей системы, из http://markmail.org/message/zn4namfhypyxum23:
От: Кристофер Шульц (chr ... @ christopherschultz.net)
Все,
Чтобы продолжить, приведенный ниже код можно использовать для получения доступных в настоящее время шифров для SSL и покажет, включены ли они в вашей конкретной JVM. Обратите внимание, что все это не относится к Tomcat:
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import javax.net.ssl.SSLServerSocketFactory;
public class SSLInfo
{
public static void main(String[] args)
throws Exception
{
SSLServerSocketFactory ssf =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
String[] defaultCiphers = ssf.getDefaultCipherSuites();
String[] availableCiphers = ssf.getSupportedCipherSuites();
TreeMap ciphers = new TreeMap();
for(int i=0; i<availableCiphers.length; ++i )
ciphers.put(availableCiphers[i], Boolean.FALSE);
for(int i=0; i<defaultCiphers.length; ++i )
ciphers.put(defaultCiphers[i], Boolean.TRUE);
System.out.println("Default\tCipher");
for(Iterator i = ciphers.entrySet().iterator(); i.hasNext(); ) {
Map.Entry cipher=(Map.Entry)i.next();
if(Boolean.TRUE.equals(cipher.getValue()))
System.out.print('*');
else
System.out.print(' ');
System.out.print('\t');
System.out.println(cipher.getKey());
}
}
}
Скомпилируйте вышеуказанное и запустите java SSLInfo
из командной строки, чтобы получить список допустимых строк шифра для вашей системы.