Como desabilito o suporte SSLv3 no Apache Tomcat?

20

Estou tentando reconfigurar meu servidor Apache Tomcat para usar apenas o TLSv1. No entanto, ele ainda está voltando ao SSLv3 usando determinados navegadores.

Eu configurei a tag <connector> com as seguintes configurações:

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

Estou faltando uma configuração ou tenho algo presente que não deveria estar presente?

rmiesen
fonte
Qual é o problema da v3? Eu pensei que a v1 tinha problemas de segurança.
Mdpc
8
@mdpc POODLE afeta o SSLv3.
CoverosGene
2
Versão do Tomcat? Versão JDK? Nas versões recentes, sslProtocol é TLS por padrão.
Xavier Lucas
2
rmeisen: As respostas variarão de acordo com as versões do Tomcat e Java e se você estiver usando o JSSE nos versos AJP. As diferenças são tão sutis quanto os sslProtocols=TLSv1versos sslProtocol="TLS"(percebeu isso s?). A especificação de suas versões do Tomcat e Java o salvará da loucura.
Stefan Lasiewski

Respostas:

12

Dependendo da versão do Tomcat 5 e da versão 6, o SSLEnabled = "true" pode não funcionar, pois foi adicionado no meio do release. Para superar isso, basta editar o seguinte: sslProtocols = TLS Para: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Parece estranho, mas, embora diga TLS, contém o SSL 3.

Isso foi corrigido nas instâncias do Tomcat 5.5.20 e Tomcat 6. -Greg

Eu acredito que você precisa fazer é:

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

Não tenho certeza sobre a definição do conjunto de cifras, no entanto, sslprotocols apenas deve ser definido como TLSv1, TLSv1.1, TLSv1.2

dependendo da sua versão do tomcat, será diferente, outras possíveis soluções:

Tomcat 5 e 6

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

** Nas distros baseadas em RHEL5, o seguinte se aplica às versões do Tomcat 6 anteriores ao Tomcat 6.0.38 **

Observe que TLSv1.1,TLSv1.2é suportado pelo Java 7, não pelo Java 6. A adição dessas diretivas a um servidor executando o Java 6 é inofensiva, mas não ativará o TLSv1.1 e o 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 do 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" />

o acima foi alterado para atender às especificações do conector acima. Fonte: https://access.redhat.com/solutions/1232233

RCG
fonte
11
Para sua informação, sslEnabledProtocolsnão funcionou para nós no Tomcat 6. sslProtocols = "TLSv1,...."funcionou.
Stefan Lasiewski
4

Eu tenho um caso de uso semelhante, que permite ao Tomcat 7 usar estritamente apenas o TLSv1.2, para não voltar a protocolos SSL anteriores, como TLSv1.1 ou SSLv3.

Estou usando: C: \ apache-tomcat-7.0.64-64bit e C: \ Java64 \ jdk1.8.0_60.

Seguindo estas instruções: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . O Tomcat é relativamente simples de configurar o suporte SSL.

De muitas referências, testei muitas combinações, finalmente encontrei 1 que forçará o Tomcat 7 a aceitar apenas TLSv1.2. 2 lugares necessários para tocar:

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

Onde

keystoreFile = armazenamento confiável autoassinado local

org.apache.coyote.http11.Http11Protocol = Implementação JSSE BIO.

Nós não usamos org.apache.coyote.http11.Http11AprProtocol, porque é alimentado por openssl. O openssl subjacente voltará a suportar protocolos SSL anteriores.

2) Ao iniciar o Tomcat, ative os seguintes parâmetros do ambiente.

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"

A restrição JAVA_OPTS é necessária, caso contrário, o Tomcat (que é alimentado por Java8) voltará a suportar protocolos SSL anteriores.

Inicie o Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Podemos ver que JAVA_OPTS aparece no log de inicialização do 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

Em seguida, podemos usar o comando openssl para verificar nossa configuração. Primeiro, conecte o host local: 8443 com o protocolo TLSv1.1. O Tomcat se recusa a responder com o certificado do 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 com o protocolo TLSv1.2, o Tomcat responde o ServerHello com o 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

Isso prova que o Tomcat agora responde estritamente apenas à solicitação TLSv1.2.

oracle
fonte
Resposta muito agradável e completa! Parabéns!
Jenny D diz Reinstate Monica
Descobri que isso JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2não é necessário (Tomcat 8.0.29, Java 1.8.0_74). Também não é mencionado aqui: wiki.apache.org/tomcat/Security/POODLE
Paul #
0

No Tomcat 6.0.41, você precisará usar o conector de bloqueio, pois o NIO está ignorando essas configurações.

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

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

Porta do conector = "443" protocol = "org.apache.coyote.http11.Http11Protocol" maxThreads = "esquema 200" = "https" secure = "true" SSLEnabled = "true" clientAuth = "false"
keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>

PaulAndrewLang
fonte
0

No Tomcat 5.5, você deve usar parâmetro não documentado

protocols="TLSv1"

restringir o uso de exatamente esta versão do protocolo.

Microfone
fonte
0

Para desativar o SSL 3 (POODLE) no Jboss 4.0.3 SP1 (Tomcat 5.5 com java 1.5) no server.xml, altere seu código assim.

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

para Tomcats mais recentes usam sslProtocols e sslEnabledProtocols de combinação como esta:

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

Primeiro de tudo, como o @iviorel diz, não é sslProtocols, é sslProtocol. (Por que a resposta dele foi reduzida?)

JSSE
Para mim, no Tomcat 7 e Java 7, sslProtocola seguinte configuração não 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" />

Diz:

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

Mas o seguinte funciona muito bem:

<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 desativar o SSL v3 e ativar o protocolo TLSv1:

SSLProtocol="TLSv1"

Para ativar os protocolos TLSv1, TLSv1.1, TLSv1.2:

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

Ou:

SSLProtocol="all"

Nota: os valores "TLSv1.1", "TLSv1.2" requerem o Tomcat Native 1.1.32 e uma versão do Tomcat que o suporte.

Rad
fonte