Come disabilitare il supporto SSLv3 in Apache Tomcat?


20

Sto cercando di riconfigurare il mio server Apache Tomcat per utilizzare solo TLSv1. Tuttavia, sta ancora ricadendo su SSLv3 utilizzando alcuni browser.

Ho impostato il tag <connector> con le seguenti impostazioni:

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

Mi manca un'impostazione di configurazione o ho qualcosa di presente che non avrei dovuto presentare?


Qual è il problema con la v3? Ho pensato che v1 avesse problemi di sicurezza.
mdpc,

8
@mdpc POODLE influenza SSLv3.
CoverosGene,

2
Versione Tomcat? Versione JDK? Nelle versioni recenti sslProtocol è TLS per impostazione predefinita.
Xavier Lucas,

2
rmeisen: le risposte varieranno a seconda delle versioni di Tomcat e Java e se si utilizza JSSE contro AJP. Le differenze sono sottili come i sslProtocols=TLSv1versetti sslProtocol="TLS"(noti che s?). Specificare le tue versioni Tomcat e Java ti salverà dalla follia.
Stefan Lasiewski,

Risposte:


12

A seconda della versione di Tomcat 5 e della versione 6, SSLEnabled = "true" potrebbe non funzionare poiché è stato aggiunto a metà rilascio. Per superare questo è sufficiente modificare quanto segue: sslProtocols = TLS A: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Sembra strano ma anche se dice TLS, contiene SSL 3.

Ciò è stato risolto sul nostro Tomcat 5.5.20 e sulle nostre istanze Tomcat 6. -Greg

Credo che ciò che devi fare sia:

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

Non sono sicuro sulla definizione della suite di crittografia, tuttavia i protocolli ssl dovrebbero essere impostati su TLSv1, TLSv1.1, TLSv1.2

a seconda della versione di Tomcat differirà, altre potenziali soluzioni:

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

** Nelle distribuzioni basate su RHEL5, quanto segue si applica alle versioni Tomcat 6 precedenti a Tomcat 6.0.38 **

Si noti che TLSv1.1,TLSv1.2è supportato da Java 7, non Java 6. L'aggiunta di queste direttive a un server che esegue Java 6 è innocua, ma non abiliterà TLSv1.1 e 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" />

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

quanto sopra viene modificato per soddisfare le specifiche del connettore sopra indicate. Fonte: https://access.redhat.com/solutions/1232233


1
Cordiali saluti, sslEnabledProtocolsnon ha funzionato per noi su Tomcat 6. ha sslProtocols = "TLSv1,...."fatto.
Stefan Lasiewski,

4

Ho un caso d'uso simile, che consente a Tomcat 7 di utilizzare rigorosamente solo TLSv1.2, di non ricorrere a protocolli SSL precedenti come TLSv1.1 o SSLv3.

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

Seguendo queste istruzioni: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat è relativamente semplice da configurare il supporto SSL.

Da molti riferimenti ho testato molte combinazioni, infine ho trovato 1 che impone a Tomcat 7 di accettare solo TLSv1.2. 2 punti necessari per toccare:

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

dove

keystoreFile = trust store locale autofirmato

org.apache.coyote.http11.Http11Protocol = Implementazione JSSE BIO.

Non usiamo org.apache.coyote.http11.Http11AprProtocol, perché è alimentato da openssl. Il openssl sottostante tornerà a supportare i precedenti protocolli SSL.

2) All'avvio di Tomcat, abilitare i seguenti parametri di 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"

È richiesta la limitazione JAVA_OPTS, altrimenti Tomcat (che è basato su Java8) tornerà a supportare i precedenti protocolli SSL.

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

Possiamo vedere JAVA_OPTS appare nel registro di avvio di 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

Quindi, possiamo usare il comando openssl per verificare la nostra configurazione. Connetti prima localhost: 8443 con protocollo TLSv1.1. Tomcat rifiuta di rispondere con il certificato del server.

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

Connetti localhost: 8443 con protocollo TLSv1.2, Tomcat risponde ServerHello con certificato:

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

Ciò dimostra che Tomcat ora risponde rigorosamente solo alla richiesta TLSv1.2.


Risposta molto bella e completa! Complimenti!
Jenny D dice di reintegrare Monica il

Ho scoperto che JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2non è necessario (Tomcat 8.0.29, Java 1.8.0_74). Non è nemmeno menzionato qui: wiki.apache.org/tomcat/Security/POODLE
Paul


0

In Tomcat 6.0.41, dovrai utilizzare il connettore di blocco poiché NIO ignora tali impostazioni.

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

http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%3C5440F1C6.3040205@apache.org%3E

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


0

In Tomcat 5.5 è necessario utilizzare un parametro non documentato

protocols="TLSv1"

per limitare l'utilizzo di questa versione del protocollo.


0

Per disabilitare SSL 3 (POODLE) in Jboss 4.0.3 SP1 (Tomcat 5.5 con java 1.5) in server.xml modificare il codice in questo modo.

<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

per i Tomcats più recenti utilizzare combo sslProtocols e sslEnabledProtocols in questo modo:

<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

Prima di tutto, come dice @iviorel, non lo è sslProtocols, lo è sslProtocol. (Perché la sua risposta è stata ridotta?)

JSSE
Per me, su Tomcat 7 e Java 7, sslProtocolnella seguente configurazione non funziona:

<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

Ma quanto segue funziona bene:

<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
Per disabilitare SSL v3 e abilitare il protocollo TLSv1:

SSLProtocol="TLSv1"

Per abilitare i protocolli TLSv1, TLSv1.1, TLSv1.2:

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

O:

SSLProtocol="all"

Nota: i valori "TLSv1.1", "TLSv1.2" richiedono Tomcat Native 1.1.32 e una versione di Tomcat che lo supporta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.