首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Jetty中不允许特定的SSL协议?

如何在Jetty中不允许特定的SSL协议?
EN

Stack Overflow用户
提问于 2013-11-11 18:36:38
回答 2查看 11.4K关注 0票数 3

我有一个web应用程序运行在Jetty 6+ Open 7上Debian6.0.7上。当客户端启动HTTPS连接时,我需要接受TLS握手,而不是SSLv3.0握手。

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

代码语言:javascript
复制
<New class="org.mortbay.jetty.security.SslSocketConnector">
    <Set name="protocol">TLS</Set>
    ...

使用此配置,web服务器似乎仍然接受SSLv3.0握手。这已经通过'sslscan‘工具和运行'curl -sslv3 -kv {host}’进行了验证。

是否可以将Jetty配置为只接受TLS握手?如果需要,我愿意升级我的Jetty版本。

EN

回答 2

Stack Overflow用户

发布于 2013-11-12 19:01:52

我找到了两个解决方案:

升级到Jetty 9,它支持jetty.xml条目:

代码语言:javascript
复制
<Arg name="sslContextFactory">
    ...
    <Set name="excludeProtocols">
      <Array type="java.lang.String">
        <Item>SSLv3</Item>
      </Array>
     </Set>

或者,使用Jetty 6为SslSocketConnector和SSLServerSocketFactory创建委托类:

代码语言:javascript
复制
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(); }
}
票数 5
EN

Stack Overflow用户

发布于 2014-11-14 22:17:41

对于Jetty 6,您还可以创建一个覆盖的SslSelectChannelConnector来删除SSLv3,如下所示:

代码语言:javascript
复制
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中指定连接器,如下所示:

代码语言:javascript
复制
<Call name="addConnector">
 <Arg>
   <New class="com.mycompany.SslSelectChannelConnectorNoSsl3">
   ...
   </New>
 </Arg>
</Call>  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19913403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档