Tomcat 是不是支持 TLS v1.2?

Posted

技术标签:

【中文标题】Tomcat 是不是支持 TLS v1.2?【英文标题】:Does Tomcat support TLS v1.2?Tomcat 是否支持 TLS v1.2? 【发布时间】:2012-04-02 17:00:37 【问题描述】:

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

【问题讨论】:

Tomcat 根本不支持 TLS。它是支持它的 Java(通过 JSSE)或 OpenSSL。他们支持哪个版本的 TLS 取决于他们是哪个版本。您的问题格式不正确。 【参考方案1】:

我有一个类似的用例,就是让 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 支持相对简单。

从许多参考资料中我测试了许多组合,最后我发现 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 协议。

启动Tomcat C:\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 请求。

【讨论】:

【参考方案2】:

在 JSSE 实现中,Oracle JDK 版本 7 支持 TLS 版本 1.2。由于 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。 能否请您告诉我您为此所做的所有更改,我尝试在连接器中指定 sslProtocol="TLSv1.1" 但没有奏效。 不要忘记,Tomcat 可以通过 OpenSSL-JSSE 提供程序使用 OpenSSL,也可以将 APR 连接器与 OpenSSL 结合使用。使用 OpenSSL 时,您可以使用 支持的任何协议。或者,您可以使用其他加密提供商,例如 BouncyCastle。 @ashish 指定sslProtocol=TLSv1.1 不起作用,因为您需要改用sslEnabledProtocols【参考方案3】:

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

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

更新:似乎 Tomcat Native 1.1.32 和 Tomcat 8.0.15/7.0.57 最终将支持 TLSv1.2。

【讨论】:

【参考方案4】:

我还希望将 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即可。

【讨论】:

以上是关于Tomcat 是不是支持 TLS v1.2?的主要内容,如果未能解决你的问题,请参考以下文章

在 Tomcat 中配置 SSL/TLS 以支持 HTTPS

如何在 Android 应用程序中启用 TLS 1.2 支持(在 Android 4.1 JB 上运行)

如何在Android应用程序中启用TLS 1.2支持(在Android 4.1 JB上运行)

.NET Core TLS 协议指定被我钻了空子~~~

SSL/TLS 配置

验证 curl 是不是使用 TLS