如何在Jetty中禁用SSLv3协议以防止Poodle攻击。

19

是否有特定的排除列表可用,仅禁用SSLv3密码,而不是TLSv1/2。

我使用的是Jetty 8,现在无法升级到9。我的当前jetty-ssl.xml如下:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call name="addConnector">
    <Arg>
        <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
            <Arg>
                <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
                    .........
                </New>
            </Arg>
            <Set name="ExcludeCipherSuites">
                <Array type="java.lang.String">             
                <Item>SSL_RSA_WITH_NULL_MD5</Item>
                <Item>SSL_RSA_WITH_NULL_SHA</Item>
                <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
                <Item>SSL_RSA_WITH_RC4_128_MD5</Item>
                <Item>SSL_RSA_WITH_RC4_128_SHA</Item>
                <Item>SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5</Item>
                <Item>SSL_RSA_WITH_IDEA_CBC_SHA</Item>
                <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
                <Item>SSL_RSA_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_DH_DSS_WITH_DES_CBC_SHA</Item>
                <Item>SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_DH_RSA_WITH_DES_CBC_SHA</Item>
                <Item>SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
                <Item>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
                <Item>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</Item>
                <Item>SSL_DH_anon_WITH_RC4_128_MD5</Item>
                <Item>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</Item>
                <Item>SSL_DH_anon_WITH_DES_CBC_SHA</Item>
                <Item>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</Item>
                <Item>SSL_FORTEZZA_KEA_WITH_NULL_SHA</Item>
                <Item>SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA</Item>
                <Item>SSL_FORTEZZA_KEA_WITH_RC4_128_SHA</Item>
                <Item>SSL_DHE_RSA_WITH_AES_128_CBC_SHA</Item>
                <Item>SSL_RSA_WITH_AES_128_CBC_SHA</Item>   
                </Array>
            </Set>
        </New>
    </Arg>
</Call>

即使我运行 "sslscan --no-failed --ssl3 localhost:443" ,我仍然会得到:

    Supported Server Cipher(s):
  Accepted  SSLv3  128 bits  DHE-RSA-AES128-SHA
  Accepted  SSLv3  128 bits  AES128-SHA

Prefered Server Cipher(s):
  SSLv3  128 bits  DHE-RSA-AES128-SHA

1
在Jetty中打开了一个新的错误,要求从Jetty 9.3开始默认禁用SSLv3 - https://bugs.eclipse.org/447381 - Joakim Erdfelt
3个回答

13

我在一个集成了Jetty源代码的应用程序中不得不禁用SSLv3。基于我在代码中所做的更改,我猜你需要添加以下内容:

<Set name="ExcludeProtocols">
    <Array type="java.lang.String">             
       <Item>SSLv3</Item>
    </Array>
</Set>

试一试,如果对你有效,请让我知道。


请更新您的答案,说明此配置适用于SslContextFactory,并且适用于Jetty 7/8/9(已测试所有3个版本,均可使用)。 - Joakim Erdfelt

4
为了进一步解释@Lars的答案...
对于Jetty 7、Jetty 8和Jetty 9,您必须在任何用于配置基于SSL的连接器的上排除协议(而不是密码)。
对于Jetty分发版...
编辑${jetty.home}/etc/jetty-ssl.xml并添加以下XML片段。
<Set name="ExcludeProtocols">
  <Array type="java.lang.String">
     <Item>SSLv3</Item>
  </Array>
</Set>

在任何管理org.eclipse.jetty.http.ssl.SslContextFactory的元素内部

对于Jetty嵌入式

您创建/管理用于SSL连接器的任何SslContextFactory,只需设置排除的协议即可。

    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.addExcludeProtocols("SSLv3");
    sslContextFactory.setKeyStorePath(...);
    ...

我仍然被Jetty v6困住了(因为它仍然基于Eclipse 3.7),我该怎么做呢?sslContextFactory.addExcludeProtocols()不存在... - centic
1
Jetty 6没有这种支持。抱歉。您必须自己制作SslSocketConnector。请参见Karl在另一个问题上的答案,以获取一些示例代码库-https://dev59.com/GHnZa4cB1Zd3GeqPkwNe#19937704-顺便说一句,Jetty 6在2010年就已经停产了,自那时以来就没有漏洞修复。Poodle只是它缺少修复的数百个漏洞之一(如果在Windows上使用Jetty,则将其乘以3)。强烈建议升级或不要在公共互联网上运行Jetty 6。 - Joakim Erdfelt
@centic 这是关于Eclipse自身升级到Jetty 9的错误跟踪问题,链接:https://bugs.eclipse.org/401784 - Joakim Erdfelt
是的,我知道它已经过时了,不幸的是升级Eclipse是一项重大工作,并且对于已经交付给许多客户的软件来说并不是一个选项。我们通过在SslSocketConnector上注册LivecycleListener并在那里访问和调整新创建的ServerSocket找到了一个解决方法。 - centic

0

我已经配置了Jetty 8.1,没有使用ssl3。您可以查看jetty-ssl.xml的完整结构。

    <Configure id="Server" class="org.eclipse.jetty.server.Server">
        <Call name="addConnector">
         <Arg>
           <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
             <Arg>
               <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
                 <Set name="keyStore">... </Set>    
                 <Set name="keyStorePassword">... </Set>
                 <Set name="keyManagerPassword">... </Set>
                 <Set name="trustStore">... </Set>
                 <Set name="trustStorePassword">... </Set>
                 <Set name="ExcludeProtocols">
                  <Array type="java.lang.String">
                     <Item>SSLv3 </Item>
                  </Array>
                </Set>
               </New>
             </Arg>
             <Set name="port">... </Set>
             <Set name="maxIdleTime">... </Set>
           </New>
         </Arg>
       </Call>
    </Configure>


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