3

ネイティブの Apache Portable Runtime SSL コネクタを使用して Tomcat 6 で Web アプリケーションを実行し、SSL 接続を提供します。BEAST 攻撃を防ぐためにサーバーを構成するにはどうすればよいですか? 推奨されるソリューション (1) は、SSLHonorCipherOrder パラメータ (2) を設定できないため、Tomcat 構成では構成できません。

現在、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

4

3 に答える 3

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 攻撃が修正されます。

于 2013-06-02T11:12:57.747 に答える
0

「SSLHonorCipherOrder」と同じようにプレーンJavaで有効にするソリューションを見つけました。(bootclasspath) を介して元の Sun JSSE のいくつかの行にパッチを適用し、Server Server の順序が機能するようにします。

クラス: 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");
}
于 2013-06-01T18:02:24.160 に答える