web-dev-qa-db-fra.com

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

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?

20
rmiesen

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 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 avant Tomcat 6.0.38 **

Notez que TLSv1.1,TLSv1.2 est pris en charge par Java 7, 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/12322

12
RCG

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 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.

4
oraclesoon

La documentation de Tomcat 7 indique clairement que les options sslEnabledProtocols et sslProtocol sont prises en charge et qu'il y a un chevauchement entre elles:
https://Tomcat.Apache.org/Tomcat-7.0-doc/config/http.html

1
Gene M

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

JSSE
Pour moi, sur Tomcat 7 et Java 7, sslProtocol dans 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.

0
Rad

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

0
Abaya Natarajan

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

protocols="TLSv1"

pour restreindre l'utilisation de cette version de protocole.

0
Mic

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

0
PaulAndrewLang

pour les nouveaux Tomcats, utilisez la combinaison 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=""/>

0
andrej