Comment désactiver la prise en charge SSLv3 dans Apache Tomcat?

20

J'essaie de reconfigurer mon serveur Apache Tomcat pour utiliser uniquement TLSv1. Cependant, il revient toujours à SSLv3 en utilisant certains navigateurs.

J'ai configuré la balise <connector> avec les paramètres suivants:

<Connector ...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA" sslEnabledProtocols="TLSv1" />

Suis-je absent d'un paramètre de configuration ou ai-je quelque chose de présent que je n'aurais pas dû présenter?

rmiesen
la source
Quel est le problème avec la v3? Je pensais que la v1 avait des problèmes de sécurité.
mdpc
8
@mdpc POODLE affecte SSLv3.
CoverosGene
2
Version Tomcat? Version JDK? Dans les versions récentes, sslProtocol est TLS par défaut.
Xavier Lucas
2
rmeisen: Les réponses varient en fonction de vos versions de Tomcat et Java, et si vous utilisez JSSE versets AJP. Les différences sont aussi subtiles que les sslProtocols=TLSv1versets sslProtocol="TLS"(Remarquez cela s?). La spécification de vos versions Tomcat et Java vous évitera la folie.
Stefan Lasiewski

Réponses:

12

Selon la version de Tomcat 5 et de la version 6, SSLEnabled = "true" peut ne pas fonctionner car il a été ajouté à la mi-version. Pour dépasser cela, il vous suffit de modifier les éléments suivants: sslProtocols = TLS À: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Cela semble étrange mais même s'il dit TLS, il contient le SSL 3.

Cela l'a corrigé sur nos instances Tomcat 5.5.20 et Tomcat 6. -Greg

Je crois que ce que vous devez faire est:

Jboss:

<Connector protocol="HTTP/1.1" SSLEnabled="true" 
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" clientAuth="false" 
       keystoreFile="${jboss.server.home.dir}/conf/keystore.jks"
       keystorePass="rmi+ssl"
       sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Pas sûr de la définition de la suite de chiffrement, mais sslprotocols doit simplement être défini sur TLSv1, TLSv1.1, TLSv1.2

en fonction de votre version de tomcat, elle sera différente, d'autres solutions potentielles:

Tomcat 5 et 6

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

** Sur les distributions basées sur RHEL5, ce qui suit s'applique aux versions de Tomcat 6 antérieures à Tomcat 6.0.38 **

Notez que TLSv1.1,TLSv1.2Java 7 est pris en charge, pas Java 6. L'ajout de ces directives à un serveur exécutant Java 6 est inoffensif, mais n'activera pas TLSv1.1 et TLSv1.2.

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Tomcat> = 7

<Connector...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
       clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Connecteurs Tomcat APR

<Connector...
               maxThreads="200"
               enableLookups="true" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               SSLEnabled="true" 
               SSLProtocol="TLSv1"
               SSLCertificateFile="${catalina.base}/conf/localhost.crt"
               SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" />

ce qui précède est modifié pour répondre aux spécifications de vos connecteurs ci-dessus. Source: https://access.redhat.com/solutions/1232233

RCG
la source
1
Pour info, sslEnabledProtocolsn'a pas fonctionné pour nous sur Tomcat 6. l'a sslProtocols = "TLSv1,...."fait.
Stefan Lasiewski
4

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.

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" />

keystoreFile = magasin de confiance local auto-signé

org.apache.coyote.http11.Http11Protocol = Implémentation JSSE BIO.

Nous ne l'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 que 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.

oraclesoon
la source
Réponse très agréable et complète! Gloire!
Jenny D dit Réintégrer Monica
J'ai trouvé que ce JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2n'était pas nécessaire (Tomcat 8.0.29, Java 1.8.0_74). Ce n'est pas mentionné ici non plus: wiki.apache.org/tomcat/Security/POODLE
Paul
0

Dans Tomcat 6.0.41, vous devrez utiliser le connecteur de blocage car le NIO ignore ces paramètres.

http://wiki.apache.org/tomcat/Security/POODLE

http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%[email protected]%3E

Port du connecteur = "443" protocol = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" scheme = "https" secure = "true" SSLEnabled = "true" clientAuth = "false"
keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>

PaulAndrewLang
la source
0

Dans Tomcat 5.5, vous devez utiliser un paramètre non documenté

protocols="TLSv1"

pour restreindre l'utilisation de cette version de protocole.

Micro
la source
0

Pour désactiver SSL 3 (POODLE) dans Jboss 4.0.3 SP1 (Tomcat 5.5 avec java 1.5) dans server.xml, changez votre code comme ceci.

<Connector port="443" address="${jboss.bind.address}" maxThreads="100" strategy="ms" maxHttpHeaderSize="8192" emptySessionPath="true" scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/eCP.keystore" keystorePass="password" sslProtocol="TLS" protocols="TLSv1,TLSv1.1,TLSv1.2" />

Abaya Natarajan
la source
0

pour les Tomcats plus récents, utilisez le combo sslProtocols et sslEnabledProtocols comme ceci:

<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocols="TLSv1,TLSv1.1,TLSv1.2" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" SSLEnabled="true" URIEncoding="UTF-8" keystorePass=""/>

andrej
la source
0

Tout d'abord, comme le dit @iviorel, ce n'est pas sslProtocolsle cas sslProtocol. (Pourquoi sa réponse at-elle baissé?)

JSSE
Pour moi, sur Tomcat 7 et Java 7, sslProtocoldans la configuration suivante ne fonctionne pas:

<Connector SSLEnabled="true" clientAuth="false" 
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit" 
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol" 
scheme="https" secure="true" sslProtocol="TLSv1,TLSv1.1,TLSv1.2" />

Ça dit:

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-443"]
java.io.IOException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:465)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:187)
    at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:398)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:646)
    ...
Caused by: java.security.NoSuchAlgorithmException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSSLContext(JSSESocketFactory.java:478)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:439)
    ... 19 more

Mais ce qui suit fonctionne très bien:

<Connector SSLEnabled="true" clientAuth="false" 
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit" 
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol" 
scheme="https" secure="true" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" />

APR
Pour désactiver SSL v3 et activer le protocole TLSv1:

SSLProtocol="TLSv1"

Pour activer les protocoles TLSv1, TLSv1.1, TLSv1.2:

SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"

Ou:

SSLProtocol="all"

Remarque: les valeurs "TLSv1.1", "TLSv1.2" nécessitent Tomcat Native 1.1.32 et une version de Tomcat qui le prend en charge.

Rad
la source