Как запретить определенные протоколы SSL в Jetty?

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

В моем 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, если это необходимо.


person Karl    schedule 11.11.2013    source источник
comment
Я нашел два решения. 1) Обновите до Jetty 9, которая поддерживает запись SslContextFactory: ‹Set name=excludeProtocols› ‹Array type=java.lang.String› ‹Item›SSLv3‹/Item› ‹/Array› ‹/Set› 2) В Jetty 6 , создайте класс Java, расширяющий SslSocketConnector, переопределив метод:   -  person Karl    schedule 12.11.2013


Ответы (2)


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

Обновитесь до 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(); }
}
person Karl    schedule 12.11.2013

Для 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>  
person gageorge    schedule 14.11.2014