如何在 Apache Tomcat 中禁用 SSLv3 支持?

如何在 Apache Tomcat 中禁用 SSLv3 支持?

我正在尝试重新配置我的 Apache Tomcat 服务器以仅使用 TLSv1。但是,使用某些浏览器时它仍然会回退到 SSLv3。

我使用以下设置来设置 <connector> 标签:

<Connector ...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA" sslEnabledProtocols="TLSv1" />

我是否缺少配置设置或者存在一些不应该存在的东西?

答案1

根据 Tomcat 5 和版本 6 的版本,SSLEnabled="true" 可能不起作用,因为它是在发布中期添加的。要绕过此问题,您只需编辑以下内容:sslProtocols = TLS 改为:sslProtocols = "TLSv1,TLSv1.1,TLSv1.2"

看起来很奇怪,但即使它说的是 TLS,它也包含 SSL 3。

这修复了我们的 Tomcat 5.5.20 和 Tomcat 6 实例上的问题。 -Greg

我相信你需要做的是:

Jboss:

<Connector protocol="HTTP/1.1" SSLEnabled="true" 
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" clientAuth="false" 
       keystoreFile="${jboss.server.home.dir}/conf/keystore.jks"
       keystorePass="rmi+ssl"
       sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

不确定密码套件定义,但 sslprotocols 应该设置为TLSv1、TLSv1.1、TLSv1.2

根据你的 tomcat 版本不同,其他潜在的解决方案:

Tomcat 5 和 6

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

**在基于 RHEL5 的发行版中,以下内容适用于 Tomcat 6 版本Tomcat 6.0.38 之前版本**

请注意,TLSv1.1,TLSv1.2Java 7 支持该功能,而不是 Java 6。将这些指令添加到运行 Java 6 的服务器是无害的,但不会启用 TLSv1.1 和 TLSv1.2。

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Tomcat >=7

<Connector...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
       clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Tomcat APR 连接器

<Connector...
               maxThreads="200"
               enableLookups="true" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               SSLEnabled="true" 
               SSLProtocol="TLSv1"
               SSLCertificateFile="${catalina.base}/conf/localhost.crt"
               SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" />

以上内容已修改,以符合您上述连接器的规格要求。来源:https://access.redhat.com/solutions/1232233

答案2

我有一个类似的用例,即让 Tomcat 7 严格仅使用 TLSv1.2,而不是回退到早期的 SSL 协议,例如 TLSv1.1 或 SSLv3。

我正在使用:C:\apache-tomcat-7.0.64-64bit 和 C:\Java64\jdk1.8.0_60。

按照此说明:https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html. Tomcat 设置 SSL 支持相对简单。

我从许多参考资料中测试了许多组合,最终我发现 1 个组合将强制 Tomcat 7 仅接受 TLSv1.2。需要触及 2 个地方:

1)在C:\apache-tomcat-7.0.64-64bit\conf\server.xml中

<Connector port="8443" 
 protocol="org.apache.coyote.http11.Http11Protocol"
 maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
 keystoreFile="ssl/.keystore" keystorePass="changeit"
 clientAuth="false" sslProtocol="SSL" sslEnabledProtocols="TLSv1.2" />

在哪里

keystoreFile= 本地自签名信任库

org.apache.coyote.http11.Http11Protocol= JSSE BIO 实现。

我们不使用org.apache.coyote.http11.Http11AprProtocol,因为它由 openssl 提供支持。底层 openssl 将回退以支持早期的 SSL 协议。

2)启动Tomcat时,启用以下环境参数。

set JAVA_HOME=C:\Java64\jdk1.8.0_60
set PATH=%PATH%;C:\Java64\jdk1.8.0_60\bin
set CATALINA_HOME=C:\apache-tomcat-7.0.64-64bit
set JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2" -Dsun.security.ssl.allowUnsafeRenegotiation=false -Dhttps.protocols="TLSv1.2"

需要 JAVA_OPTS 限制,否则 Tomcat(由 Java8 提供支持)将回退到支持早期的 SSL 协议。

启动 TomcatC:\apache-tomcat-7.0.64-64bit\bin\startup.bat

我们可以看到JAVA_OPTS出现在Tomcat启动日志中。

Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djdk.tls.client.protocols=TLSv1.2
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dsun.security.ssl.allowUnsafeRenegotiation=false
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dhttps.protocols=TLSv1.2

然后,我们可以使用 openssl 命令来验证我们的设置。首先使用 TLSv1.1 协议连接 localhost:8443。Tomcat 拒绝使用服务器证书回复。

C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_1
Loading 'screen' into random state - done
CONNECTED(000001C0)
5372:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes

使用TLSv1.2协议连接localhost:8443,Tomcat使用证书回复ServerHello:

C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_2
Loading 'screen' into random state - done
CONNECTED(000001C0)
depth=1 C = US, ST = Washington, L = Seattle, O = getaCert - www.getacert.com
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
   i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
1 s:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
   i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
Server certificate
-----BEGIN CERTIFICATE-----
(ignored)
-----END CERTIFICATE-----
subject=/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
issuer=/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2367 bytes and written 443 bytes

这证明 Tomcat 现在仅严格响应 TLSv1.2 请求。

答案3

Tomcat 7 文档明确指出支持sslEnabledProtocolssslProtocol选项,并且它们之间存在重叠:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

答案4

在 Tomcat 5.5 中你应该使用未记录的参数

protocols="TLSv1"

严格限制使用此协议版本。

相关内容