Je veux savoir si Apache Tomcat prend en charge le protocole TLS v1.2. Je n'ai trouvé aucune documentation à ce sujet! Merci!
TLS version 1.2 est pris en charge par Oracle JDK version 7, dans l'implémentation JSSE. Étant donné que Tomcat utilise JSSE comme bibliothèque SSL sous-jacente, il doit être pris en charge à partir de la version 1.7 du JDK. Vérifiez également vos suites de chiffrement SSL activées dans Tomcat.
Si vous utilisez Apache comme proxy, veuillez consulter la documentation Apache et OpenSSL sous-jacente.
Quelques liens:
http://docs.Oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html (Améliorations de la sécurité Java SE 7)
J'ai un cas d'utilisation similaire, qui est de permettre à Tomcat 7 d'utiliser strictement TLSv1.2, et non de revenir aux protocoles SSL antérieurs tels que TLSv1.1 ou SSLv3. Les étapes suivantes expliquent comment activer Tomcat pour prendre en charge TLSv1.2.
J'utilise: C:\Apache-Tomcat-7.0.64-64bit et C:\Java64\jdk1.8.0_60.
En suivant cette instruction: https://Tomcat.Apache.org/Tomcat-7.0-doc/security-howto.html . Tomcat est relativement simple à configurer la prise en charge SSL.
À partir de nombreuses références, j'ai testé de nombreuses combinaisons, enfin j'ai trouvé 1 qui imposera à Tomcat 7 d'accepter TLSv1.2 uniquement. 2 endroits nécessaires pour toucher:
1) Dans 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" />
où
keystoreFile = magasin de confiance local auto-signé
org.Apache.coyote.http11.Http11Protocol = Implémentation JSSE BIO.
Nous n'utilisons pas org.Apache.coyote.http11.Http11AprProtocol, car il est alimenté par openssl. Le openssl sous-jacent se repliera pour prendre en charge les protocoles SSL antérieurs.
2) Au démarrage de Tomcat, activez les paramètres d'environnement suivants.
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"
La restriction Java_OPTS est requise, sinon Tomcat (qui est alimenté par Java8) se repliera pour prendre en charge les protocoles SSL antérieurs.
Démarrez Tomcat C:\Apache-Tomcat-7.0.64-64bit\bin\startup.bat
Nous pouvons voir Java_OPTS apparaît dans le journal de démarrage de 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
Ensuite, nous pouvons utiliser la commande openssl pour vérifier notre configuration. Connectez d'abord localhost: 8443 avec le protocole TLSv1.1. Tomcat refuse de répondre avec un certificat de serveur.
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
Connectez localhost: 8443 avec le protocole TLSv1.2, Tomcat répond ServerHello avec un certificat:
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
Cela prouve que Tomcat répond désormais strictement à la demande TLSv1.2 uniquement.
Comme mentionné par d'autres, Tomcat prend en charge TLSv1.2 via JSSE dans JDK 7+.
Tomcat ne prend PAS en charge TLSv1.1 ou TLSv1.2 lorsqu'il est utilisé avec Tomcat Native (APR). Voir https://issues.Apache.org/bugzilla/show_bug.cgi?id=53952 .
Mise à jour: il semble que TLSv1.2 sera enfin pris en charge dans Tomcat Native 1.1.32 et Tomcat 8.0.15/7.0.57.
Je cherchais également à mettre à niveau sslProtocol vers TLSv1.1 et comme mentionné dans les liens ci-dessous sur Java6 et 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
Les SSLContext pris en charge dans Java6 sont SSL, TLSv1 et dans Java7 SSL, TLSv1, TLSv1.1 et TLSv1.2 sont pris en charge.
Ainsi, pour activer TLSv1.1 ou TLSv1.2 dans Tomcat, il vous suffit de mettre à niveau vers Java7 et de modifier le sslProtocol dans Connector dans server.xml de Tomcat.