Tomcat 修复程序中列出的非 GCM 密码是否https://weakdh.org/sysadmin.html有错别字?
在“Apache Tomcat”标题下和文本“在 server.xml 文件中(用于 JSSE)”下方,有以下连接器密码配置。
我的问题与最后 14 个密码有关(名称中没有 GCM 的密码)
(为方便阅读添加了新行)
<Connector ciphers="[GCM Ciphers],
TLS_ECDHE_RSA_WITH_AES_128_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_SHA,
TLS_ECDHE_RSA_WITH_AES_256_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_SHA,
TLS_ECDHE_ECDSA_WITH_AES_256_SHA,
TLS_DHE_RSA_WITH_AES_128_SHA256,
TLS_DHE_RSA_WITH_AES_128_SHA,
TLS_DHE_DSS_WITH_AES_128_SHA256,
TLS_DHE_RSA_WITH_AES_256_SHA256,
TLS_DHE_DSS_WITH_AES_256_SHA,
TLS_DHE_RSA_WITH_AES_256_SHA
" />
应该是这些 CBC 密码吗?
<Connector ciphers="[GCM Ciphers],
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
" />
看起来他们的名字中缺少 CBC_。
例如:
TLS_DHE_RSA_WITH_AES_256_SHA 应为 TLS_DHE_RSA_WITH_AES_256_CBC_SHA。根据https://www.openssl.org/docs/apps/ciphers.html,后者存在,前者不存在。
如果你看看弱者网站点上,您可以看到其他产品使用不同的密码命名约定。使用 OpenSSL 密码列表,您可以将这些名称映射到 Tomcat 使用的名称,并发现它们映射到 CBC 密码。
我尝试使用来自弱者网在我的 server.xml 中发布,但没有任何效果。看来,只要有一个密码拼写错误或不是合法的密码名称,Tomcat 就会忽略这些密码,然后 Tomcat 会重新使用 JVM 的默认密码。一旦我将 CBC_ 添加到密码名称中,Tomcat 就会开始使用 Connector ciphers 属性中列出的密码。
weakdh.org 解决方案是否有拼写错误,或者我遗漏了什么?
答案1
来自weakdh.org的密码似乎对您的系统无效,所以,是的,它正在恢复默认设置。weakdh.org上列出的密码可能在他们测试过的其他系统上有效,或者它们可能完全错误,我不能完全确定,但我知道它们不在列表中这里,因此它们可能在任何地方都无效。
要获取系统的有效密码套件列表,请从http://markmail.org/message/zn4namfhypyxum23:
来自:克里斯托弗·舒尔茨([电子邮件保护])
全部,
接下来,下面的代码可用于获取当前可用的 SSL 密码,并显示它们是否在您的特定 JVM 中启用。请注意,这些都不是 Tomcat 独有的:
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import javax.net.ssl.SSLServerSocketFactory;
public class SSLInfo
{
public static void main(String[] args)
throws Exception
{
SSLServerSocketFactory ssf =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
String[] defaultCiphers = ssf.getDefaultCipherSuites();
String[] availableCiphers = ssf.getSupportedCipherSuites();
TreeMap ciphers = new TreeMap();
for(int i=0; i<availableCiphers.length; ++i )
ciphers.put(availableCiphers[i], Boolean.FALSE);
for(int i=0; i<defaultCiphers.length; ++i )
ciphers.put(defaultCiphers[i], Boolean.TRUE);
System.out.println("Default\tCipher");
for(Iterator i = ciphers.entrySet().iterator(); i.hasNext(); ) {
Map.Entry cipher=(Map.Entry)i.next();
if(Boolean.TRUE.equals(cipher.getValue()))
System.out.print('*');
else
System.out.print(' ');
System.out.print('\t');
System.out.println(cipher.getKey());
}
}
}
编译上述内容并java SSLInfo
从命令行运行以获取系统有效密码字符串列表。