Frage Wie deaktiviere ich die SSLv3-Unterstützung in Apache Tomcat?


Ich versuche, meinen Apache Tomcat-Server so zu konfigurieren, dass er nur TLSv1 verwendet. Mit bestimmten Browsern wird jedoch immer noch auf SSLv3 zurückgegriffen.

Ich habe das <connector> -Tag mit den folgenden Einstellungen eingerichtet:

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

Fehle ich eine Konfigurationseinstellung oder habe etwas, das ich nicht hätte präsentieren sollen?


20
2017-10-16 21:20


Ursprung


Was ist das Problem mit v3? Ich dachte, dass v1 Sicherheitsprobleme hatte. - mdpc
@mdpc POODLE wirkt sich auf SSLv3 aus. - CoverosGene
Tomcat Version? JDK-Version? In neueren Versionen ist sslProtocol standardmäßig TLS. - Xavier Lucas
rmeisen: Die Antworten variieren je nach Tomcat- und Java-Version und wenn Sie JSSE-Verse AJP verwenden. Die Unterschiede sind so subtil wie sslProtocols=TLSv1 Verse sslProtocol="TLS" (Beachte das s?). Die Angabe Ihrer Tomcat- und Java-Versionen wird Sie vor Wahnsinn bewahren. - Stefan Lasiewski


Antworten:


Abhängig von der Version von Tomcat 5 und Version 6 funktioniert SSLEnabled = "true" möglicherweise nicht, da es Mitte der Veröffentlichung hinzugefügt wurde. Um darüber zu kommen, müssen Sie nur Folgendes bearbeiten: sslProtocols = TLS Zu: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Scheint seltsam, aber obwohl es TLS enthält, enthält es die SSL 3.

Dies wurde auf unseren Tomcat 5.5.20 und unseren Tomcat 6 Instanzen behoben. -Greg

Ich glaube, was Sie tun müssen, ist:

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

Nicht sicher in der Cipher Suite Definition aber sslprotocols sollte nur eingestellt werden TLSv1, TLSv1.1, TLSv1.2

Abhängig von Ihrer Tomcat-Version wird es andere mögliche Lösungen geben:

Tomcat 5 und 6

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

** Auf RHEL5-basierten Distributionen gilt Folgendes für Tomcat 6-Versionen vor Tomcat 6.0.38 **

Beachten Sie, dass TLSv1.1,TLSv1.2 wird von Java 7 und nicht von Java 6 unterstützt. Das Hinzufügen dieser Direktiven zu einem Server, auf dem Java 6 ausgeführt wird, ist zwar harmlos, aktiviert jedoch nicht TLSv1.1 & 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" />

Tomcat APR-Anschlüsse

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

Die obigen Angaben wurden so geändert, dass sie den Spezifikationen Ihrer Steckverbinder entsprechen. Quelle: https://access.redhat.com/solutions/1232233


12
2017-10-16 23:46



Zu Ihrer Information, sslEnabledProtocols hat auf Tomcat 6 nicht funktioniert. sslProtocols = "TLSv1,...." hat getan. - Stefan Lasiewski


Ich habe einen ähnlichen Anwendungsfall, der es Tomcat 7 ermöglicht, ausschließlich TLSv1.2 zu verwenden und nicht auf frühere SSL-Protokolle wie TLSv1.1 oder SSLv3 zurückzugreifen.

Ich verwende: C: \ apache-tomcat-7.0.64-64bit und C: \ Java64 \ jdk1.8.0_60.

Befolgen Sie diese Anweisung: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html. Tomcat ist relativ einfach, SSL-Unterstützung einzurichten.

Aus vielen Referenzen habe ich viele Kombinationen getestet, schließlich habe ich 1 gefunden, die Tomcat 7 dazu bringt, nur TLSv1.2 zu akzeptieren. 2 Orte zum Anfassen:

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

woher

keystoreFile = lokaler selbstsignierter Trust Store

org.apache.coyote.http11.Http11Protocol = JSSE BIO-Implementierung.

Wir benutzen es nicht org.apache.coyote.http11.Http11AprProtocol, weil es von openssl betrieben wird. Die zugrunde liegende openssl wird zurückfallen, um frühere SSL-Protokolle zu unterstützen.

2) Aktivieren Sie beim Start von Tomcat die folgenden Umgebungsparameter.

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"

Die JAVA_OPTS-Einschränkung ist erforderlich, andernfalls greift Tomcat (das von Java8 unterstützt wird) zurück, um frühere SSL-Protokolle zu unterstützen.

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

Wir können sehen, dass JAVA_OPTS im Tomcat-Startprotokoll erscheint.

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

Dann können wir den Befehl openssl verwenden, um unser Setup zu überprüfen. Verbinden Sie zunächst localhost: 8443 mit dem TLSv1.1-Protokoll. Tomcat verweigert die Antwort mit dem Serverzertifikat.

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

Connect localhost: 8443 mit TLSv1.2 Protokoll, Tomcat antwortet ServerHello mit Zertifikat:

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

Dies beweist, dass Tomcat nun ausschließlich auf die TLSv1.2-Anfrage reagiert.


4
2017-10-16 09:58



Sehr schöne und gründliche Antwort! Kudos! - Jenny D
Ich habe das gefunden JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2 ist nicht notwendig (Tomcat 8.0.29, Java 1.8.0_74). Es wird auch hier nicht erwähnt: wiki.apache.org/tomcat/Security/PAODLE - Paul


Die Dokumentation von Tomcat 7 besagt eindeutig, dass die sslEnabledProtocols und sslProtocol Optionen werden unterstützt und es gibt Überschneidungen zwischen ihnen:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html


1
2018-05-10 19:42





In Tomcat 6.0.41 müssen Sie den blockierenden Connector verwenden, da der NIO diese Einstellungen ignoriert.

http://wiki.apache.org/tomcat/Sicherheit/PAODLE

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

Connector Port = "443" Protokoll = "org.apache.coyote.http11.Http11Protocol"     maxThreads = "200" schema = "https" sicher = "wahr"     SSLEnabled = "wahr" clientAuth = "false"
    keystoreFile = "tomcat.jks"     keystorePass = "ändern"     sslEnabledProtocols = "TLSv1, TLSv1.1, TLSv1.2" />


0
2017-10-29 19:17





In Tomcat 5.5 sollten Sie undokumentierte Parameter verwenden

protocols="TLSv1"

um die Verwendung von excatly diese Protokollversion einzuschränken.


0
2018-02-27 12:44





Um SSL 3 (POODLE) in JBoss 4.0.3 SP1 (Tomcat 5.5 mit Java 1.5) in server.xml zu deaktivieren, ändern Sie Ihren Code wie folgt.

<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
2018-03-22 14:32





für neuere Tomcats verwenden sslProtocols und sslEnabledProtocols Combo wie folgt:

<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
2018-04-02 15:22





Zuallererst, wie @iviorel sagt, ist es nicht sslProtocols, es ist sslProtocol. (Warum wurde seine Antwort downscore?)

JSSE
Für mich, auf Tomcat 7 und Java 7, sslProtocol in der folgenden Konfiguration funktioniert nicht:

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

Es sagt:

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

Aber Folgendes funktioniert gut:

<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
So deaktivieren Sie SSL v3 und aktivieren das TLSv1-Protokoll:

SSLProtocol="TLSv1"

So aktivieren Sie TLSv1-, TLSv1.1- und TLSv1.2-Protokolle:

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

Oder:

SSLProtocol="all"

Hinweis: Die Werte "TLSv1.1", "TLSv1.2" erfordern Tomcat Native 1.1.32 und eine Version von Tomcat, die dies unterstützt.


0
2017-11-02 05:56