2012-04-13 9 views
3

Wir betreiben eine Webanwendung auf Tomcat 6 mit dem nativen Apache Portable Runtime SSL-Konnektor, um SSL-Konnektivität bereitzustellen. Wie können wir den Server konfigurieren, um den BEAST Angriff zu verhindern? Die vorgeschlagene Lösung (1) kann in der Tomcat-Konfiguration nicht konfiguriert werden, da der Parameter SSLHonorCipherOrder nicht festgelegt werden kann (2).protect tomcat 6 apr SSL gegen BEAST Angriff

Wir verwenden derzeit nur die Einstellung SSLCipherSuite = "ECDHE-RSA-AES256-SHA384: AES256-SHA256: RC4: HOCH: MD5: Anüll: EDH: AESGCM", sondern ein Scan mit der SSL-Server-Test zeigt, Der Server ist immer noch anfällig für den BEAST-Angriff. Ich weiß, dass wir das Problem lösen können, indem wir Tomcat mit einem Apache-Proxy konfrontieren, aber diese Änderung ist zu invasiv, um sie kurzfristig umzusetzen. Ich kann Tomcat auch patchen, um Unterstützung hinzuzufügen, aber das würde automatische Updates des Tomcat-Pakets verhindern, das gegen Richtlinien verstößt.

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

Antwort

1

ich nie meine Lösung veröffentlicht diesen. Es ist ein bisschen ein Hack, aber Sie müssen JSSE oder Tomcat nicht patch/rekompilieren.

Erstellen Sie die folgende Klasse:

/* 
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"); 
    } 
} 

dann den Anschluss konfigurieren, dass diese Hilfsklasse zu verwenden:

<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"/> 

Dies behebt den Angriff BEAST.

2

Der logische Weg, um dieses Problem zu lösen, ist für Tomcat eine CipherOrder Richtlinie umzusetzen, die als dieser BugZilla Link zeigt, scheint in Tomcat 7.0.30 eingebaut werden weiter. Ich bin am meisten daran interessiert, dies auszuprobieren, wird Feedback nach dem Versuch. https://issues.apache.org/bugzilla/show_bug.cgi?id=53481

+0

Der oben erwähnte Fehlerbericht besagt, dass die CipherOrder-Direktive für Tomcat 6 bereits im August vorgeschlagen wurde, aber ich sehe keinen Beweis, dass sie bereits implementiert wurde. Gibt es inzwischen eine klare Lösung für den BEAST Angriff mit Tomcat 6? Wir führen Tomcat 6.0.35 und JRE 1.6.0_38 aus und versäumen Trustwaves und SSL Labs (https://www.sslablabs.com/ssltest/) Compliance-Scans. –

+0

Das letzte Bug-Update vom Januar 2013 sagt: [Fixed in Tomcat 6.0.x. Wird in Tomcat 6.0.37 sein.] (Https://issues.apache.org/bugzilla/show_bug.cgi?id=53481#c7) –

+0

Die Änderung ist jetzt in tomcat 6.x und 7.x. Sie können die Konfigurationsoption (SSLHonorCipherOrder) in den Dokumenten sehen: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html Ich habe diese Option jedoch nur aktiviert (sie wurde meinem Connector auf dem Server hinzugefügt). xml, mit tomcat 7.0.40) und löschte die Biest-Angriffsfehlermeldung von https://www.ssllabs.com/ssltest NICHT – Keith

0

Ich habe eine Lösung gefunden, um in plain java dasselbe wie "SSLHonorCipherOrder" zu aktivieren. Patchen einige Zeilen der ursprünglichen Sun JSSE über (bootclasspath), um Server Server Auftrag arbeiten.

Klasse: sun.security.ssl.ServerHandshaker

Feld hinzufügen

public static boolean preferServerOrder = true;

ersetzen Methode 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"); 
}