Как отключить поддержку 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" />

Я пропустил настройку конфигурации или у меня есть какой-то подарок, который мне не нужно было показывать?

rmiesen
источник
В чем проблема с 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 To: 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 он будет отличаться, другие возможные решения:

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

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

<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
К вашему сведению, 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. Базовый openssl будет использовать более ранние протоколы 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.

oraclesoon
источник
Очень хороший и подробный ответ! Престижность!
Дженни Ди говорит восстановить Монику
Я обнаружил, что в JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2этом нет необходимости (Tomcat 8.0.29, Java 1.8.0_74). Здесь также не упоминается: wiki.apache.org/tomcat/Security/POODLE
Пол
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

Соединитель port = "443" protocol = "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 "/>

PaulAndrewLang
источник
0

В Tomcat 5.5 вы должны использовать недокументированный параметр

protocols="TLSv1"

ограничить использование именно этой версии протокола.

микрофон
источник
0

Чтобы отключить SSL 3 (POODLE) в Jboss 4.0.3 SP1 (Tomcat 5.5 с java 1.5) в server.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, которая его поддерживает.

Rad
источник