Tomcat是否支持TLS v1.2?

20

我想知道Apache Tomcat是否支持TLS v1.2协议。我没有找到任何关于这个的文档!谢谢!


Tomcat根本不支持TLS。它是通过Java(通过JSSE)或OpenSSL来支持的。它们支持的TLS版本取决于它们的版本。你的问题表述不清楚。 - user207421
4个回答

22

我有一个类似的用例,就是使Tomcat 7严格使用只支持TLSv1.2,不会降级到早期的SSL协议,如TLSv1.1或SSLv3。下面的步骤将说明如何使Tomcat支持TLSv1.2。

我正在使用: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支持。

从许多参考资料中,我测试了许多组合,最终找到了一种方法,可以强制Tomcat 7仅接受TLSv1.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"

为确保Tomcat(由Java8驱动)不会回退以支持早期的SSL协议,需要限制JAVA_OPTS。

启动Tomcat:C:\apache-tomcat-7.0.64-64bit\bin\startup.bat。

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

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协议连接本地主机的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的请求。


15

Oracle JDK版本7中支持TLS 1.2,在JSSE实现中。由于Tomcat使用JSSE作为底层SSL库,因此应该从JDK版本1.7开始支持。另外,请检查Tomcat中启用的SSL密码套件。

如果您正在使用Apache作为代理,请查看Apache和基础OpenSSL文档。

一些链接:

http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html(Java SE 7安全增强)

http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html

http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html


非常感谢!我终于使用JSSE配置在Tomcat上实现了TLS v1.2。 - observer
1
请问您能告诉我您对此做了哪些更改吗?我尝试在连接器中指定sslProtocol="TLSv1.1",但没有起作用。 - Ashish
不要忘记,Tomcat可以通过OpenSSL-JSSE提供程序或使用带有OpenSSL的APR连接器来使用OpenSSL。当使用OpenSSL时,您可以使用它支持的任何协议。或者,您可以使用其他加密提供程序,例如BouncyCastle。 - Christopher Schultz
1
@ashish 指定 sslProtocol=TLSv1.1 是无效的,因为你需要使用 sslEnabledProtocols - Christopher Schultz

8

正如其他人所提到的,Tomcat通过JDK 7+中的JSSE支持TLSv1.2。

当使用Tomcat Native(APR)时,Tomcat不支持TLSv1.1或TLSv1.2。请参见https://issues.apache.org/bugzilla/show_bug.cgi?id=53952

更新:看起来TLSv1.2将在Tomcat Native 1.1.32和Tomcat 8.0.15 / 7.0.57中得到支持。


2
我也想将sslProtocol升级到TLSv1.1,正如以下链接中提到的Java6和Java7。

Java6 http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html Java7 http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

Java6支持的SSLContext协议有SSL、TLSv1,而Java7支持的协议有SSL、TLSv1、TLSv1.1和TLSv1.2。
因此,要在Tomcat中启用TLSv1.1或TLSv1.2,只需升级到Java7并更改Tomcat的server.xml文件中Connector的sslProtocol参数即可。

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