¿Cómo deshabilito el soporte SSLv3 en Apache Tomcat?

20

Estoy tratando de reconfigurar mi servidor Apache Tomcat para usar solo TLSv1. Sin embargo, todavía está volviendo a SSLv3 usando ciertos navegadores.

Configuré la etiqueta <connector> con la siguiente configuración:

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

¿Me falta una configuración o tengo algo presente que no debería tener presente?

rmiesen
fuente
¿Cuál es el problema con v3? Pensé que v1 tenía problemas de seguridad.
mdpc
8
@mdpc POODLE afecta a SSLv3.
CoverosGene
2
¿Versión de Tomcat? Versión JDK? En versiones recientes, sslProtocol es TLS por defecto.
Xavier Lucas
2
rmeisen: Las respuestas variarán dependiendo de sus versiones de Tomcat y Java, y si está usando los versos JSSE AJP. Las diferencias son tan sutiles como los sslProtocols=TLSv1versos sslProtocol="TLS"(¿Te das cuenta s?). Especificar sus versiones de Tomcat y Java lo salvará de la locura.
Stefan Lasiewski

Respuestas:

12

Dependiendo de la versión de Tomcat 5 y la Versión 6, SSLEnabled = "true" podría no funcionar ya que se agregó a mediados de lanzamiento. Para superar esto, solo necesita editar lo siguiente: sslProtocols = TLS Para: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Parece extraño pero aunque dice TLS, contiene el SSL 3.

Esto lo solucionó en nuestro Tomcat 5.5.20 y nuestras instancias de Tomcat 6. -Greg

Creo que lo que debes hacer es:

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

No estoy seguro de la definición del conjunto de cifrado, sin embargo, sslprotocols solo debe establecerse en TLSv1, TLSv1.1, TLSv1.2

dependiendo de su versión de tomcat será diferente, otras posibles soluciones:

Tomcat 5 y 6

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

** En las distribuciones basadas en RHEL5, lo siguiente se aplica a las versiones de Tomcat 6 anteriores a Tomcat 6.0.38 **

Tenga en cuenta que TLSv1.1,TLSv1.2es compatible con Java 7, no con Java 6. Agregar estas directivas a un servidor que ejecuta Java 6 es inofensivo, pero no habilitará TLSv1.1 y 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" />

Conectores APR Tomcat

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

lo anterior se modifica para satisfacer las especificaciones de sus conectores anteriores. Fuente: https://access.redhat.com/solutions/1232233

RCG
fuente
1
FYI, sslEnabledProtocolsno funcionó para nosotros en Tomcat 6. sslProtocols = "TLSv1,...."sí.
Stefan Lasiewski
4

Tengo un caso de uso similar, que es permitir que Tomcat 7 use estrictamente solo TLSv1.2, no recurrir a protocolos SSL anteriores como TLSv1.1 o SSLv3.

Estoy usando: C: \ apache-tomcat-7.0.64-64bit y C: \ Java64 \ jdk1.8.0_60.

Siguiendo estas instrucciones: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat es relativamente sencillo de configurar el soporte SSL.

De muchas referencias probé muchas combinaciones, finalmente encontré 1 que obligará a Tomcat 7 a aceptar solo TLSv1.2. 2 lugares necesarios para tocar:

1) En 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" />

dónde

keystoreFile = almacén de confianza autofirmado local

org.apache.coyote.http11.Http11Protocol = Implementación JSSE BIO.

No utilizamos org.apache.coyote.http11.Http11AprProtocol, ya que funciona con openssl. El openssl subyacente recurrirá para admitir protocolos SSL anteriores.

2) Cuando inicie Tomcat, habilite los siguientes parámetros del entorno.

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"

Se requiere la restricción JAVA_OPTS; de lo contrario, Tomcat (que funciona con Java8) recurrirá a los protocolos SSL anteriores.

Poner en marcha Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Podemos ver que JAVA_OPTS aparece en el registro de inicio 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

Entonces, podemos usar el comando openssl para verificar nuestra configuración. Primero conecte localhost: 8443 con el protocolo TLSv1.1. Tomcat se niega a responder con el certificado del servidor.

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

Conecte localhost: 8443 con el protocolo TLSv1.2, Tomcat responde ServerHello con el certificado:

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

Esto demuestra que Tomcat ahora responde estrictamente solo a la solicitud TLSv1.2.

oraclesoon
fuente
Muy buena y completa respuesta! ¡Prestigio!
Jenny D dice Reinstate Monica
Descubrí que JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2no es necesario (Tomcat 8.0.29, Java 1.8.0_74). Tampoco se menciona aquí: wiki.apache.org/tomcat/Security/POODLE
Paul
0

En Tomcat 6.0.41, deberá usar el conector de bloqueo ya que el NIO ignora esa configuración.

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

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

Conector puerto = "443" protocolo = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" esquema = "https" seguro = "verdadero" SSLEnabled = "verdadero" clientAuth = "falso"
keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>

PaulAndrewLang
fuente
0

En Tomcat 5.5 debe usar el parámetro no documentado

protocols="TLSv1"

para restringir el uso de excatly esta versión de protocolo.

Micrófono
fuente
0

Para deshabilitar SSL 3 (POODLE) en Jboss 4.0.3 SP1 (Tomcat 5.5 con java 1.5) en server.xml, cambie su código de esta manera.

<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
fuente
0

para los Tomcats más nuevos, use sslProtocols y sslEnabledProtocols como este:

<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
fuente
0

En primer lugar, como dice @iviorel, no sslProtocolslo es sslProtocol. (¿Por qué su respuesta se volvió negativa?)

JSSE
Para mí, en Tomcat 7 y Java 7, sslProtocolen la siguiente configuración no funciona:

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

Dice:

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

Pero lo siguiente funciona 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
Para deshabilitar SSL v3 y habilitar el protocolo TLSv1:

SSLProtocol="TLSv1"

Para habilitar los protocolos TLSv1, TLSv1.1, TLSv1.2:

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

O:

SSLProtocol="all"

Nota: los valores "TLSv1.1", "TLSv1.2" requieren Tomcat Native 1.1.32 y una versión de Tomcat que lo admita.

Rad
fuente