Diffie-Hellman public 键错误 Tomcat 7

Diffie-Hellman public key error with Tomcat 7

我使用 Tomcat 和 SSL 证书成功设置了两台 Ubuntu 机器。 我在 Centos 6 中遵循了完全相同的过程,但是当我尝试连接到服务器时(使用 Opera)我得到了这个:

Server has a weak, ephemeral Diffie-Hellman public key

连接器如下,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 时,出现不受信任的通信错误。

对我来说,在 conf/server 中的 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"
        ...

它适用于 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 使用此密码)。

这是因为在访问为 SSL 配置了弱 DH 密码的网站时,新浏览器版本已经开始出现 warning/errors 问题。有关问题的更多信息,请点击以下链接

https://weakdh.org

logjam issue

要解决此问题,您可以在浏览器端或服务器端找到解决此问题的方法。服务器端是最好的,因为它将解决所有用户的问题,如果他们从不同的 browsers/locations 访问服务器。

解决我们必须确保我们的服务器(在本例中 tomcat)对 SSL 使用强密码的问题。

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

JSSE 因为它依赖于 Java 运行时,我们必须首先找出我们与 tomcat 一起使用的 Java 版本。 Tomcat7支持java1.6以上。然后我们必须找到相关 java 版本的 JSSE 支持的相应密码套件。弱的是那些有'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
...

编制一个强密码套件列表,并将其添加到 conf/server 中的连接器密码中。xml 在您的 tomcat

<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"
...
/>

重新启动服务器,error/warning 应该会消失。请记住,如果 Java 版本不同,上面的 copy/pasting 可能无法正常工作。因此请参考正确的版本和支持的密码套件。

注意:为了能够使用 256 位 AES 密码,需要安装 JCE Unlimited Strength Jurisdiction Policy Files

如果Tomcat配置为使用APR而不是JSSE,上述配置将不起作用。您可以按照 tomcat APR ssl 配置指南和 logjam 管理指南启用强密码套件。

对我来说,这是 tomcat 使用的 java 版本的问题。 我将版本从 JDK 6 更改为 JDK 1.7_080,错误消失了。

当我说我更改JAVA版本时,我的意思是我修改了环境变量"JAVA_HOME"。

将其添加到 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

浏览