firefox浏览器/服务器协商的选定密码与Tomcat配置的密码列表不匹配



我有点困惑。我们已将v7 Tomcat服务器配置为仅使用TSLv1.2与连接的浏览器进行通信,并指定了一组受限制的密码。使用firefox浏览器(v60.3.0esr 64位(。我们能够建立连接,但奇怪的是,在我连接到网站后,我注意到商定的密码不在配置的tomcat密码列表中。

我的印象是,在配置http连接对象时,服务器作为hello连接否定的一部分,会将连接限制在可用密码列表中吗?我错过了什么?如果密码参数丢失,那么可用密码的列表将仅限于JVM上配置的密码(这是我的理解(。因此,我是否还需要将JVM中的密码限制在我在http连接器元素中指定的同一组?

详细信息:Tomcat(版本7.0.77 java 1.8.0_151(

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" allowTrace="false"
clientAuth="false" sslProtocols="TLS" sslEnabledProtocols="TLSv1.2"
keystoreFile="/etc/tomcat/tomcat.keystore" keystorePass="XXXX"
ciphers="TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256, 
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384" />

我的tomcat.config 中没有任何特定的定义

JAVA_HOME="/usr/lib/jvm/jre"
CATALINA_BASE="/usr/share/tomcat"
CATALINE_HOME="/usr/share/tomcat"
JASPER_HOME="/usr/share/tomcat"
CATALINE_TMPDIR="/var/cache/tomcat/temp"
TOMCAT_USER="tomcat"
SECURITY_MANAGER="false"
SHUTDOWN_WAIT="30"
SHUTDOWN_VERBOSE="false"
CATALINA_PID="/var/run/tomcat.pid

建立连接后,我在浏览器窗口中右键单击,选择Inspect Element并选择Network标记,然后单击客户端请求。然后我选择了安全选项卡(用于请求(,它显示:

Protocol verson: TLSv1.2
Cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Key Exchange group: None
...

我确实注意到我们的证书已经过期(我最初连接时收到了一个安全异常(。

有人能解释一下为什么协商的密码不是tomcat密码列表中的密码之一吗?需要做什么来限制服务器支持的可用密码集?提前谢谢。

结果:因此,在启用日志记录的情况下,服务器似乎确实在我们的连接密码列表中选择了一个密码。然而,当我检查fire fox浏览安全设置时,浏览器指示它同意的密码是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。问题:

  1. 关于协议处理程序的初始化,为什么我有这么多协议不可用?这是Tomcat在研究JVM吗?出于某种原因,JVM没有这些协议集。我们不包括必需的图书馆吗
  2. 我可以在日志中看到客户端/服务器的问候消息交换和商定的密码。然而,浏览器指示了一个不同的密码,这是如何变化的?有什么东西在拦截这个交换吗?至少可以说是困惑。知道吗

关于不可用的协议,您是否确认Java中有可用的密码?确认您的Tomcat正在使用您期望的Java,正如Tomcat的Java_HOME变量所定义的那样。通过编译一个简单的Java程序,您可以获得Java中可用密码套件的列表。(同样,请确保它是用与Tomcat匹配的正确Java编译的。(这里提供了Java代码文件和说明,但为了完整起见,我将在下面包含它。

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import javax.net.ssl.SSLServerSocketFactory;
public class Ciphers
{
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("DefaulttCipher");
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());
}
}
}

在某个临时文件夹中,将此文件保存为Ciphers.java,并使用进行编译

javac Ciphers.java

然后用运行

java Ciphers

它应该输出可用密码的列表。请注意,Default Cipher的第一行不是语句,而是文本表的列标题(正如您在代码中所读到的(。

一种可能性是,您尝试使用的密码不在Java实现中,因此Tomcat不可用。

第二种可能性是,由于您使用的证书,某些密码对您不可用。加密不是我的专长,但我相信您需要RSA证书才能使用RSA密码。类似地,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384需要ECDSA证书。查看此security.stackeexchange问答。所以这些密码中有一半可能对你不起作用。

您还可以使用OpenSSL的sslscan命令来测试哪些密码套件可用。(如果您没有指定端口,它将假定为443。(

sslscan localhost:8443

它将有助于确定您是否正确设置了Tomcat连接器。然而,我怀疑它将与您的设置相匹配,而不会解决您的客户端连接密码套件问题。(如果你做了任何更改,别忘了重新启动Tomcat服务。我还发现,在重新启动服务后,sslscan会报告完整的结果,会有一点延迟。请等待或多次执行以确定。我认为当Tomcat准备web应用程序时,它会超时。(

不幸的是,这个答案只针对OP的一个子问题。我想看看主要问题的答案——我没有。希望其他人能。。。

最新更新