Як відключити підтримку SSLv3 в Apache Tomcat?


20

Я намагаюся перенастроїти сервер Apache Tomcat для використання лише TLSv1. Однак він все ще переходить на SSLv3 за допомогою певних браузерів.

Я встановлюю тег <connector> з такими налаштуваннями:

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

Я пропускаю налаштування конфігурації чи присутні щось таке, яке я не мав би мати?


У чому проблема з v3? Я думав, що v1 має проблеми із безпекою.
mdpc

8
@mdpc POODLE впливає на SSLv3.
CoverosGene

2
Версія Tomcat? Версія JDK? В останніх версіях sslProtocol за замовчуванням є TLS.
Ксав'є Лукас

2
rmeisen: відповіді залежать від версій Tomcat та Java, і якщо ви використовуєте вірші JSSE AJP. Відмінності настільки ж тонкі, як і sslProtocols=TLSv1вірші sslProtocol="TLS"(помічаєте це s?). Визначення версій Tomcat & Java позбавить вас від божевілля.
Стефан Ласєвський

Відповіді:


12

Залежно від версій Tomcat 5 та версії 6, SSLEnabled = "true" може не працювати, оскільки він був доданий в середині випуску. Щоб пройти це, вам просто потрібно відредагувати таке: sslProtocols = TLS До: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Здається дивним, але, хоч він і говорить про TLS, він містить SSL 3.

Це було зафіксовано на Tomcat 5.5.20 та Tomcat 6 екземплярах. -Грег

Я вважаю, що вам потрібно зробити:

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

Не впевнений у визначенні пакету шифрів, проте sslprotocols слід просто встановити на TLSv1, TLSv1.1, TLSv1.2

Залежно від вашої версії Tomcat вона буде відрізнятися, інші потенційні рішення:

Томат 5 і 6

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

** На дистрибутивах, заснованих на RHEL5, до Tomcat 6 версій до Tomcat 6.0.38 ** застосовується наступне

Зауважте, що TLSv1.1,TLSv1.2підтримується Java 7, а не Java 6. Додавання цих директив до сервера, на якому працює Java 6, є нешкідливим, але не вмикає 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" />

Томат> = 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

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

вищезгадане змінено, щоб задовольнити те, що були вказані вище. Джерело: https://access.redhat.com/solutions/1232233


1
FYI, sslEnabledProtocolsне працював для нас на Tomcat 6. sslProtocols = "TLSv1,...."зробив.
Стефан Ласєвський

4

У мене є подібний випадок використання, який полягає в тому, щоб Tomcat 7 дозволяв строго використовувати тільки TLSv1.2, щоб не повернутися до попередніх протоколів SSL, таких як TLSv1.1 або SSLv3.

Я використовую: C: \ apache-tomcat-7.0.64-64bit та C: \ Java64 \ jdk1.8.0_60.

Дотримуючись цієї інструкції: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat порівняно простий у налаштуванні підтримки SSL.

З багатьох посилань я перевірив багато комбінацій, нарешті знайшов 1, який змусить Tomcat 7 приймати лише TLSv1.2. 2 місця, які потрібно торкнутися:

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

де

keystoreFile = місцевий магазин, який підписує власні підписи

org.apache.coyote.http11.Http11Protocol = Реалізація JSSE BIO.

Ми не використовуємо org.apache.coyote.http11.Http11AprProtocol, тому що живиться від openssl. Основний opensl повернеться для підтримки попередніх протоколів SSL.

2) Під час запуску Tomcat увімкніть наступні параметри середовища.

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"

Необхідне обмеження JAVA_OPTS, інакше Tomcat (який працює на базі Java8) повернеться для підтримки попередніх протоколів SSL.

Запуск Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Ми можемо бачити, що JAVA_OPTS з'являється в журналі запуску 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

Тоді ми можемо використовувати команду openssl для перевірки нашої настройки. Спочатку підключіть localhost: 8443 з TLSv1.1 протоколом. Tomcat відмовляється відповідати сертифікатом сервера.

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

Підключіть localhost: 8443 з протоколом TLSv1.2, Tomcat відповідає ServerHello з сертифікатом:

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

Це доводить, що Tomcat тепер суворо відповідає лише на запит TLSv1.2.


Дуже приємна і ретельна відповідь! Кудо!
Дженні Д каже, що повернемо Моніку

Я виявив, що JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2це не потрібно (Tomcat 8.0.29, Java 1.8.0_74). Тут також не згадується: wiki.apache.org/tomcat/Security/POODLE
Paul


0

У Tomcat 6.0.41 вам потрібно буде використовувати роз'єм блокування, оскільки NIO ігнорує ці налаштування.

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

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

Connector port = "443" протокол = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" схема = "https" secure = "true" SSLEnabled = "true" clientAuth = "false
" keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>


0

У Tomcat 5.5 слід використовувати незадокументований параметр

protocols="TLSv1"

обмежити використання ексклюзивно цієї версії протоколу.


0

Щоб відключити SSL 3 (POODLE) в Jboss 4.0.3 SP1 (Tomcat 5.5 з java 1.5) на сервері.xml, змініть такий код так.

<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

для новіших Tomcats використовують sslProtocols і sslEnabledProtocols комбі, як це:

<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

Перш за все, як каже @iviorel, це не так sslProtocols, це sslProtocol. (Чому його відповідь отримала знижку?)

JSSE
Для Tomcat 7 та Java 7 sslProtocolу наступній конфігурації не працює:

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

Він говорить:

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

Але наступне працює чудово:

<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
Щоб вимкнути SSL v3 та включити протокол TLSv1:

SSLProtocol="TLSv1"

Щоб увімкнути протоколи TLSv1, TLSv1.1, TLSv1.2:

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

Або:

SSLProtocol="all"

Примітка: для значень "TLSv1.1", "TLSv1.2" потрібні Tomcat Native 1.1.32 та версія Tomcat, яка його підтримує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.