2013-11-11 5 views
3

У меня есть веб-приложение, работающее на Jetty 6 + Open JDK 7 на Debian 6.0.7. У меня есть требование безопасности для принятия квитирования TLS, но не SSLH3.0, когда клиент инициирует соединение HTTPS.Как запретить определенные протоколы SSL в Jetty?

В моей jetty.xml я установить протокол TLS:

<New class="org.mortbay.jetty.security.SslSocketConnector"> 
    <Set name="protocol">TLS</Set> 
    ... 

С помощью этой конфигурации, веб-сервер по-прежнему, как представляется, принять SSLv3.0 рукопожатие. Это было проверено с помощью инструмента «sslscan» и запущено «curl -sslv3 -kv {host}».

Возможно ли настроить Jetty только на подтверждение TLS? Я был бы готов обновить версию Jetty, если это необходимо.

+0

Я нашел два решения. 1) Обновление до Jetty 9, который поддерживает запись SslContextFactory: <Массив типа = "java.lang.String"> SSLv3 2) Jetty 6, создайте Java-класс, расширяющий SslSocketConnector, переопределяя метод: – Karl

ответ

4

Я нашел два решения:

Обновление до Jetty 9, который поддерживает запись jetty.xml:

<Arg name="sslContextFactory"> 
    ... 
    <Set name="excludeProtocols"> 
     <Array type="java.lang.String"> 
     <Item>SSLv3</Item> 
     </Array> 
    </Set> 

Или, с Jetty 6 создать классы делегатов для SslSocketConnector и SSLServerSocketFactory:

jetty.xml: 
    ... 
    <New class="com.src.TlsSocketConnector"> 
    ... 
    </New> 

public class TlsSocketConnector extends SslSocketConnector { 
    @Override 
    protected SSLServerSocketFactory createFactory() throws Exception { 
    return new TlsServerSocketFactory(super.createFactory()); 
    } 
} 

public class TlsServerSocketFactory extends SSLServerSocketFactory { 

    private SSLServerSocketFactory delegate; 

    public TlsServerSocketFactory(SSLServerSocketFactory delegate) { 
    this.delegate = delegate; 
    } 

    //Repeat this pattern for all createServerSocket() methods 
    public ServerSocket createServerSocket() throws IOException { 
    SSLServerSocket socket = (SSLServerSocket) delegate.createServerSocket(); 
    socket.setEnabledProtocols(new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}); 
    return socket; 
    } 

    // Directly delegated methods from SSLServerSocketFactory 
    public String[] getDefaultCipherSuites() { return delegate.getDefaultCipherSuites(); } 
    public String[] getSupportedCipherSuites() { return delegate.getSupportedCipherSuites(); } 
} 
1

Для Jetty 6 вы также можете создать переопределенный SslSelectChannelConnector, который удаляет SSLv3, например:

package com.mycompany; 

import java.io.IOException; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import javax.net.ssl.SSLEngine; 

import org.mortbay.jetty.security.SslSelectChannelConnector; 

public class SslSelectChannelConnectorNoSsl3 extends SslSelectChannelConnector { 

    @Override 
    protected SSLEngine createSSLEngine() throws IOException { 
    SSLEngine engine = super.createSSLEngine(); 
    Set<String> protocols = new HashSet<String>(Arrays.asList(engine.getEnabledProtocols())); 
    protocols.removeAll(Arrays.asList("SSLv2Hello","SSLv3")); 
    engine.setEnabledProtocols(protocols.toArray(new String[protocols.size()])); 
    return engine; 
    } 

} 

А затем указать, что разъем в jetty.xml, как это:

<Call name="addConnector"> 
<Arg> 
    <New class="com.mycompany.SslSelectChannelConnectorNoSsl3"> 
    ... 
    </New> 
</Arg> 
</Call>