Diffie-Hellman公钥与Tomcat 7的错误

14

我已经成功地在两台Ubuntu机器上安装了Tomcat和SSL证书。我按照完全相同的过程在Centos 6上进行操作,但是当我尝试连接到服务器时(使用Opera),我遇到了以下问题:

服务器具有弱的、临时的Diffie-Hellman公钥。

连接器如下所示,在catalina.log中没有错误:

<Connector port="some port number"  
           protocol="org.apache.coyote.http11.Http11Protocol" 
           SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="path to jks"
           keystoreType="JKS"
           keystorePass="mypass1"
           keyPass="mypass2"  /> 

使用Firefox时,我遇到了不受信任的通信错误。

5个回答

30

在我的情况下,我在conf/server.xml的Tomcat配置中添加了一组允许使用的密码来禁用弱Diffie-Hellman密码后,问题得到了解决:

    <Connector
        ...
        ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
        ...

2
我们知道这个列表是否是确定的吗?我们应该如何确认每个Tomcat版本的列表? - Techmag
我没有找到一个通用的列表,因为有些密码被一些人认为是安全的,而被其他人认为是不安全的。因此,很大程度上取决于您的环境,如果您控制客户端,甚至可以将其缩小到只使用您想要使用的一个。 - centic
以下是一些进一步的链接,它们详细解释了这个问题:https://blog.eveoh.nl/2014/02/tls-ssl-ciphers-pfs-tomcat/http://devtidbits.com/2015/05/13/secure-and-harden-apache-tomcats-ssltls/http://security.stackexchange.com/questions/89689/what-is-logjam-and-how-do-i-prevent-it - eramm
对于那些运行Tomcat 5.5/Java 6的可怜家伙来说:APR连接器是一种解决方法。 - Jochen Bedersdorfer
太棒了!我一直在跟随教程,在新的Tomcat实例上运行现有的通配符证书,这是最后的障碍。谢谢! - Ternary
大约一年前,我在OWASP指南上添加了一些可行的示例配置。这将是为所有人贡献改进的好地方。https://www.owasp.org/index.php/Securing_tomcat#Sample_Configuration_-_Better_Security - Richard Brightwell

7
由于新的浏览器版本开始在访问配置了弱DH密码的SSL网站时发出警告/错误,因此出现了这种情况。有关该问题的更多信息,请参阅以下链接。

https://weakdh.org

logjam问题

要解决这个问题,你可以在浏览器端或服务器端找到一个解决方法。服务器端是最好的选择,因为它将为所有用户解决问题,无论他们使用不同的浏览器/位置访问服务器。

为了解决这个问题,我们必须确保我们的服务器(在这种情况下是Tomcat)使用强大的SSL密码。

在Tomcat中,有两种不同的SSL实现。默认是作为Java运行时的一部分提供的JSSE实现。另一个是APR实现,默认使用OpenSSL引擎。

由于JSSE依赖于Java运行时,我们必须首先找出我们正在使用哪个Java版本与Tomcat一起使用。Tomcat 7支持Java 1.6及以上版本。然后我们必须找到相应的密码套件,这些密码套件受JSSE相关Java版本支持。弱密码套件是包含“DHE”的套件,所以选择不包含“DHE”的套件。下面列出了Java 1.6 JSSE的一些更强的密码套件。

TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_ECDH_ECDSA_WITH_RC4_128_SHA
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDH_RSA_WITH_RC4_128_SHA
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_ECDSA_WITH_NULL_SHA
TLS_ECDH_RSA_WITH_NULL_SHA
TLS_ECDHE_ECDSA_WITH_NULL_SHA
TLS_ECDHE_RSA_WITH_NULL_SHA
...

编译一个强密码套件列表,并将其添加到您的Tomcat中conf/server.xml中的连接器密码中。
<Connector
...
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_RC4_128_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_RC4_128_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_NULL_SHA,TLS_ECDH_RSA_WITH_NULL_SHA,TLS_ECDHE_ECDSA_WITH_NULL_SHA,TLS_ECDHE_RSA_WITH_NULL_SHA"
...
/>

重新启动服务器,错误/警告应该会消失。请注意,如果Java版本不同,则复制/粘贴上述内容可能无法正常工作。因此,请参考正确的版本和支持的密码套件。
注意:要使用256位AES密码套件,必须安装JCE无限制权限策略文件。
如果Tomcat配置为使用APR而不是JSSE,则上述配置将无法工作。您可以按照Tomcat SSL配置指南和logjam管理指南启用强密码套件。

2
将以下内容添加到server.xml文件中并重新启动服务器。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="150" scheme="https" secure="true"
       keystoreFile="keystorePath"
       keystorePass="keystorepass"
       ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
       clientAuth="false" sslProtocol="TLS"/>

尝试使用https://localhost:8443浏览网页。

1

它适用于Google Chrome ver.44,特别感谢Jason Scroggins的建议:

  1. 在新标签页中,输入或粘贴about:config到地址栏中并按Enter键。点击承诺小心的按钮。
  2. 在列表上方的搜索框中,输入或粘贴dhe并暂停一下,直到列表被过滤。
  3. 双击security.ssl3.dhe_rsa_aes_128_sha选项以将其从true切换为false(禁用Firefox使用此密码)。
  4. 双击security.ssl3.dhe_rsa_aes_256_sha选项以将其从true切换为false(禁用Firefox使用此密码)。

0
对我来说,这是Tomcat使用的Java版本的问题。 我将版本从JDK 6更改为JDK 1.7_080,错误消失了。 当我说我更改了JAVA版本时,我指的是修改了环境变量“JAVA_HOME”。

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