【问题标题】:How to config local Jetty ssl to avoid weak phermeral DH key error?如何配置本地 Jetty ssl 以避免弱临时 DH 密钥错误?
【发布时间】:2015-05-29 07:10:07
【问题描述】:

我正在使用 keytool 生成密钥库来配置本地开发码头以运行 ssl

keytool.exe -keystore jetty.keystore -alias jetty -genkey -keyalg RSA -sigalg SHA256withRSA

码头配置:

<Call name="addConnector">
    <Arg>
        <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
            <Arg>
                <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
                    <Set name="keyStore">jetty/jetty.keystore</Set>
                    <Set name="keyStorePassword">jetty6</Set>
                    <Set name="keyManagerPassword">jetty6</Set>
                    <Set name="trustStore">jetty/jetty.keystore</Set>
                    <Set name="trustStorePassword">jetty6</Set>
                </New>
            </Arg>
            <Set name="port">8443</Set>
            <Set name="maxIdleTime">30000</Set>
        </New>
    </Arg>
</Call>

直到最近在 Firefox Aurora 和 Chrome Canary 等新浏览器中它都可以正常工作,但它拒绝(在 Firefox 的情况下):

连接到 localhost:8443 时出错。收到 SSL 服务器密钥交换握手中的弱临时 Diffie-Hellman 密钥 信息。 (错误代码:ssl_error_weak_server_ephemeral_dh_key)

没有办法手动接受。那么,我应该重新生成一个更强的密钥吗?或者是jetty中的配置?

【问题讨论】:

    标签: java ssl jetty


    【解决方案1】:

    接受的答案并没有为我解决这个问题(Jetty 9.2、Java 7),但是这样做了:

    <Set name="ExcludeCipherSuites">
      <Array type="String">
        <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
        <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
        <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
        <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
        <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
        <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
        <!-- Disable cipher suites with Diffie-Hellman key exchange to prevent Logjam attack 
        and avoid the ssl_error_weak_server_ephemeral_dh_key error in recent browsers -->
        <Item>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
        <Item>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</Item>
        <Item>TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</Item>
        <Item>TLS_DHE_DSS_WITH_AES_256_CBC_SHA256</Item>
        <Item>TLS_DHE_RSA_WITH_AES_256_CBC_SHA</Item>
        <Item>TLS_DHE_DSS_WITH_AES_256_CBC_SHA</Item>
        <Item>TLS_DHE_RSA_WITH_AES_128_CBC_SHA256</Item>
        <Item>TLS_DHE_DSS_WITH_AES_128_CBC_SHA256</Item>
        <Item>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</Item>
        <Item>TLS_DHE_DSS_WITH_AES_128_CBC_SHA</Item>
      </Array>
    </Set>
    <!-- setting required for preventing Poodle attack, see http://stackoverflow.com/questions/26382540/how-to-disable-the-sslv3-protocol-in-jetty-to-prevent-poodle-attack/26388531#26388531 -->
    <Set name="ExcludeProtocols">
    <Array type="java.lang.String">
       <Item>SSLv3</Item>
    </Array>
    </Set>
    

    【讨论】:

      【解决方案2】:

      UnSandpiper 解决方案的嵌入式 Jetty 代码:

          sslContextFactory.setExcludeCipherSuites(
                  "SSL_RSA_WITH_DES_CBC_SHA",
                  "SSL_DHE_RSA_WITH_DES_CBC_SHA",
                  "SSL_DHE_DSS_WITH_DES_CBC_SHA",
                  "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
                  "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
                  // Disable cipher suites with Diffie-Hellman key exchange to prevent Logjam attack
                  //and avoid the ssl_error_weak_server_ephemeral_dh_key error in recent browsers
                  "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
                  "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
                  "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
                  "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
                  "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
                  "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
                  "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
                  "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
                  "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
                  "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
                  "TLS_DHE_DSS_WITH_AES_128_CBC_SHA");
      
          // Setting required for preventing Poodle attack,
          // see http://stackoverflow.com/questions/26382540/how-to-disable-the-sslv3-protocol-in-jetty-to-prevent-poodle-attack/26388531#26388531
          sslContextFactory.setExcludeProtocols("SSLv3");
      

      【讨论】:

        【解决方案3】:

        对码头了解不多,但看来你找错树了。

        firefox 抱怨的不是服务器密钥,而是用于建立连接的(临时)临时 DH 密钥。您需要配置码头可能使用的 SSL/TLS 加密。看看选择不同的密码套件。

        【讨论】:

          【解决方案4】:

          这适用于 OpenJDK 7,因为上面调用 setIncludeCipherSuites () 的代码无法允许任何连接

          sslContextFactory.setExcludeCipherSuites("TLS_DHE.*", "TLS_EDH.*");
          sslContextFactory.setExcludeProtocols("SSLv3");
          sslContextFactory.setRenegotiationAllowed(false);
          

          【讨论】:

            猜你喜欢
            • 2015-12-12
            • 2011-06-09
            • 2014-02-21
            • 2020-06-25
            • 1970-01-01
            • 2023-04-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多