我想知道Apache Tomcat是否支持TLS v1.2协议。我没有找到任何关于此的文档!谢谢!
答案 0 :(得分:15)
我有一个类似的用例,即使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请求。
答案 1 :(得分:12)
在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安全增强功能)
答案 2 :(得分: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中得到支持。
答案 3 :(得分: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。