Jak wyłączyć obsługę SSLv3 w Apache Tomcat?

20

Próbuję ponownie skonfigurować mój serwer Apache Tomcat, aby używał tylko TLSv1. Jednak nadal korzysta z protokołu SSLv3 w niektórych przeglądarkach.

Konfiguruję tag <connector> z następującymi ustawieniami:

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

Czy brakuje mi ustawienia konfiguracji lub mam coś, czego nie powinienem mieć?

rmiesen
źródło
W czym problem z v3? Myślałem, że v1 ma problemy z bezpieczeństwem.
mdpc
8
@mdpc POODLE wpływa na SSLv3.
CoverosGene
2
Wersja Tomcat? Wersja JDK? W najnowszych wersjach sslProtocol jest domyślnie TLS.
Xavier Lucas
2
rmeisen: Odpowiedzi będą się różnić w zależności od wersji Tomcat i Java oraz od wersji AJP JSSE. Różnice są tak subtelne jak sslProtocols=TLSv1wersety sslProtocol="TLS"(zauważ, że s?). Określenie wersji Tomcat i Java uratuje cię od szaleństwa.
Stefan Lasiewski

Odpowiedzi:

12

W zależności od wersji Tomcat 5 i wersji 6 SSLEnabled = "true" może nie działać, ponieważ została dodana w połowie wydania. Aby temu zaradzić, po prostu edytuj: sslProtocols = TLS Do: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Wydaje się to dziwne, ale mimo że zawiera TLS, zawiera SSL 3.

To naprawiło to w naszych instancjach Tomcat 5.5.20 i Tomcat 6. -Greg

Uważam, że musisz zrobić:

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

Nie jestem pewien co do definicji zestawu szyfrów, jednak sslprotocols powinno być ustawione na TLSv1, TLSv1.1, TLSv1.2

w zależności od wersji tomcat będzie się różnić, inne potencjalne rozwiązania:

Tomcat 5 i 6

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

** W dystrybucjach opartych na RHEL5, poniższe informacje dotyczą wersji Tomcat 6 wcześniejszych niż Tomcat 6.0.38 **

Należy pamiętać, że TLSv1.1,TLSv1.2jest obsługiwany przez Java 7, a nie Java 6. Dodanie tych dyrektyw do serwera z Javą 6 jest nieszkodliwe, ale nie włącza TLSv1.1 i 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" />

Złącza 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" />

powyższe zostało zmienione, aby spełnić wymagania specyfikacji złącza powyżej. Źródło: https://access.redhat.com/solutions/1232233

RCG
źródło
1
Do twojej wiadomości, sslEnabledProtocolsnie działało dla nas na Tomcat 6. działało sslProtocols = "TLSv1,....".
Stefan Lasiewski
4

Mam podobny przypadek użycia, który pozwala Tomcatowi 7 na ścisłe korzystanie tylko z TLSv1.2, bez powrotu do wcześniejszych protokołów SSL, takich jak TLSv1.1 lub SSLv3.

Używam: C: \ apache-tomcat-7.0.64-64bit i C: \ Java64 \ jdk1.8.0_60.

Postępując zgodnie z tą instrukcją: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat jest stosunkowo łatwy w konfiguracji obsługi SSL.

Z wielu referencji przetestowałem wiele kombinacji, w końcu znalazłem 1, który zmusi Tomcat 7 do akceptowania tylko TLSv1.2. 2 miejsca potrzebne do dotknięcia:

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

gdzie

keystoreFile = lokalny sklep zaufania z podpisem własnym

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

Nie używamy org.apache.coyote.http11.Http11AprProtocol, ponieważ jest zasilany przez openssl. Bazowy openssl wróci do obsługi wcześniejszych protokołów SSL.

2) Podczas uruchamiania Tomcat włącz następujące parametry środowiska.

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"

Wymagane jest ograniczenie JAVA_OPTS, w przeciwnym razie Tomcat (oparty na Javie 8) wróci do obsługi wcześniejszych protokołów SSL.

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

Widzimy, że JAVA_OPTS pojawia się w dzienniku uruchamiania 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

Następnie możemy użyć polecenia openssl, aby zweryfikować naszą konfigurację. Najpierw podłącz localhost: 8443 z protokołem TLSv1.1. Tomcat odmawia odpowiedzi przy użyciu certyfikatu serwera.

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

Połącz localhost: 8443 z protokołem TLSv1.2, Tomcat odpowiada ServerHello z certyfikatem:

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

Dowodzi to, że Tomcat teraz ściśle odpowiada tylko na żądanie TLSv1.2.

oraclesoon
źródło
Bardzo miła i dokładna odpowiedź! Sława!
Jenny D mówi Przywróć Monikę
Odkryłem, że JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2nie jest to konieczne (Tomcat 8.0.29, Java 1.8.0_74). Nie wspomniano tu również: wiki.apache.org/tomcat/Security/POODLE
Paul
0

W Tomcat 6.0.41 będziesz musiał użyć złącza blokującego, ponieważ NIO ignoruje te ustawienia.

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

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

Port złącza = protokół „443” = „org.apache.coyote.http11.Http11Protocol” maxThreads = schemat „200” = „https” secure = „true” SSLEnabled = „true” clientAuth = „false”
keystoreFile = „tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>

PaulAndrewLang
źródło
0

W Tomcat 5.5 należy użyć nieudokumentowanego parametru

protocols="TLSv1"

aby ograniczyć użycie dokładnie tej wersji protokołu.

Mikrofon
źródło
0

Aby wyłączyć SSL 3 (POODLE) w Jboss 4.0.3 SP1 (Tomcat 5.5 z java 1.5) w server.xml zmień kod w ten sposób.

<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
źródło
0

w przypadku nowszych Tomcats użyj kombinacji sslProtocols i sslEnabledProtocols w następujący sposób:

<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
źródło
0

Po pierwsze, jak mówi @iviorel, to nie sslProtocolsjest sslProtocol. (Dlaczego jego odpowiedź spadła?)

JSSE
Dla mnie na Tomcat 7 i Java 7 sslProtocolw następującej konfiguracji nie działa:

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

To mówi:

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

Ale następujące działa dobrze:

<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
Aby wyłączyć SSL v3 i włączyć protokół TLSv1:

SSLProtocol="TLSv1"

Aby włączyć protokoły TLSv1, TLSv1.1, TLSv1.2:

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

Lub:

SSLProtocol="all"

Uwaga: wartości „TLSv1.1”, „TLSv1.2” wymagają Tomcat Native 1.1.32 i wersji Tomcat, która go obsługuje.

Rad
źródło