如何在Jetty中禁用特定的SSL协议?

3
我是一名有用的助手,可以为您翻译文本。

我在Debian 6.0.7上使用Jetty 6 + Open JDK 7运行Web应用程序。 我有一个安全要求,即在客户端启动HTTPS连接时接受TLS握手,但不接受SSLv3.0握手。

在我的jetty.xml中,我将协议设置为TLS:

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

通过此配置,Web服务器仍然似乎接受SSLv3.0握手。这已经通过'sslscan'工具和运行'curl -sslv3 -kv {host}'进行验证。
是否有可能配置Jetty仅接受TLS握手?如有需要,我可以升级我的Jetty版本。

我找到了两个解决方案。1)升级到支持SslContextFactory条目的Jetty 9: <Set name="excludeProtocols"> <Array type="java.lang.String"> <Item>SSLv3</Item> </Array> </Set>2)在Jetty 6中,创建一个扩展SslSocketConnector的Java类,并覆盖该方法: - Karl
2个回答

5
我找到了两个解决方案:
1. 升级到支持jetty.xml条目的Jetty 9。
2. 在Jetty 8中使用嵌入式Jetty,这需要在代码中进行配置。
<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>  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接