2012-04-13 3 views
3

Мы запускаем веб-приложение на Tomcat 6, используя собственный SSL-соединитель Apache Portable Runtime SSL для обеспечения соединения SSL. Как мы можем настроить сервер для предотвращения атаки BEAST ?. Предлагаемое решение (1) не может быть сконфигурировано в конфигурации Tomcat, поскольку оно не позволяет установить параметр SSLHonorCipherOrder (2).защищать tomcat 6 apr SSL против атаки BEAST

В настоящее время мы используем только настройку SSLCipherSuite = "ECDHE-RSA-AES256-SHA384: AES256-SHA256: RC4: HIGH:! MD5:! ANULL:! EDH:! AESGCM", но проверка с использованием теста SSL-сервера показывает сервер по-прежнему уязвим против атаки BEAST. Я знаю, что мы можем решить эту проблему, отправив Tomcat с помощью прокси-сервера Apache, но это изменение слишком инвазивно для реализации в краткосрочной перспективе. Я также могу установить Tomcat для добавления поддержки, но это предотвратит автоматическое обновление пакета Tomcat, которое противоречит политикам.

1: https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls

2: http://tomcat.apache.org/tomcat-6.0-doc/apr.html

ответ

1

Я никогда не отправлял мое решение это. Это немного взломать, но вам не нужно патчи/перекомпилировать JSSE или Tomcat.

Создайте следующий класс:

/* 
SSLSettingHelper prevents BEAST SSL attack by setting the appropriate option. 
Due to protected variable must be in org.apache.tomcat.util.net package... 
Instruction: 
1) Compile and place JAR in tomcat /lib 
2) Add protocol="org.apache.tomcat.util.net.SSLSettingHelper" to SSL APR connector 
*/ 
package org.apache.tomcat.util.net; 

public class SSLSettingHelper extends org.apache.coyote.http11.Http11AprProtocol { 
    @Override 
    public void init() throws Exception { 
     super.init(); 
     org.apache.tomcat.jni.SSLContext.setOptions(endpoint.sslContext, org.apache.tomcat.jni.SSL.SSL_OP_CIPHER_SERVER_PREFERENCE); 
     log.info("SSLSettingHelper set SSL_OP_CIPHER_SERVER_PREFERENCE to prevent BEAST SSL attack"); 
    } 
} 

Затем настроить соединитель для использования этого вспомогательного класса:

<Connector server="Server" protocol="org.apache.tomcat.util.net.SSLSettingHelper" port="8443" maxThreads="256" scheme="https" secure="true" SSLEnabled="true" SSLCertificateFile="..." SSLCertificateKeyFile="..." SSLCertificateChainFile="..." SSLCipherSuite="ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json,text/css,text/javascript" maxPostSize="1024000"/> 

Это фиксирует атаку BEAST.

2

Логический способ решить эту проблему для Tomcat реализовать директиву CipherOrder, который, как показывает этой ссылке BugZilla, кажется, должны быть включены в Tomcat 7.0.30 и далее. Мне больше всего интересно попробовать это, получится обратная связь после попытки. https://issues.apache.org/bugzilla/show_bug.cgi?id=53481

+0

В приведенном выше сообщении об ошибке говорится, что директива CipherOrder для Tomcat 6 была предложена (еще в августе), но я не вижу никаких доказательств того, что она была реализована еще. Между тем есть ясное решение для атаки BEAST с Tomcat 6? Мы запускаем Tomcat 6.0.35 и JRE 1.6.0_38 и не выполняем проверки соответствия Trustwave и SSL Labs (https://www.ssllabs.com/ssltest/). –

+0

Последнее обновление ошибки с января 2013 года говорит: [Исправлено в Tomcat 6.0.x. Будет в Tomcat 6.0.37.] (Https://issues.apache.org/bugzilla/show_bug.cgi?id=53481#c7) –

+0

Теперь изменение находится в tomcat 6.x и 7.x. Вы можете увидеть параметр конфигурации (SSLHonorCipherOrder) в документах: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html Однако я просто включил эту опцию (добавил ее к моему коннектору на сервере. xml, с tomcat 7.0.40), и он НЕ удалял сообщение об ошибке атаки зверя с https://www.ssllabs.com/ssltest – Keith

0

Я нашел решение, разрешающее в простой java то же, что и «SSLHonorCipherOrder». Исправление некоторых строк оригинала Sun JSSE через (bootclasspath) для получения заказа сервера .

Класс: sun.security.ssl.ServerHandshaker

Добавить поле

public static boolean preferServerOrder = true;

Заменить метод chooseCipherSuite:

private void chooseCipherSuite(final HandshakeMessage.ClientHello mesg) throws IOException { 
    if(preferServerOrder) { 
     final CipherSuiteList clientList = mesg.getCipherSuites(); 
     for(final CipherSuite serverSuite : getActiveCipherSuites().collection()) { 
      if (this.doClientAuth == 2) { 
       if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue; 
       if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue; 
      } 
      if(!serverSuite.isNegotiable()) continue; 
      if(clientList.contains(serverSuite)) { 
       if (trySetCipherSuite(serverSuite)) return; 
      } 
     } 
    } else { 
     final Collection list = mesg.getCipherSuites().collection(); 
     for(final CipherSuite suite : list) { 
      if (!(isNegotiable(suite))) continue; 
      if (this.doClientAuth == 2) { 
       if (suite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue; 
       if (suite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue; 
      } 
      if (trySetCipherSuite(suite)) return; 
     } 
    } 
    fatalSE(Alerts.alert_handshake_failure, "no cipher suites in common"); 
}

 Смежные вопросы

  • Нет связанных вопросов^_^