У мене є подібний випадок використання, який полягає в тому, щоб 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. Основний opensl повернеться для підтримки попередніх протоколів 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.