У меня есть похожий вариант использования, который позволяет 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.
Запустите 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 для проверки наших настроек. Сначала подключите localhost: 8443 с протоколом TLSv1.1. 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
Подключите localhost: 8443 с протоколом TLSv1.2, 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.